SlideShare a Scribd company logo
DESIGN PATTERNS
Teeeechhh taaaaalkkkk
A design pattern is a general reusable solution to a commonly
occurring problem within a given context in software design.A
design pattern is not a finished design that can be transformed
directly into source or machine code. It is a description or
template for how to solve a problem that can be used in many
different situations.
The Gang of Four (GoF)
•Template Method	

•Strategy	

•Observer	

•Composite	

•Iterator	

•Command	

•Adapter	

•Proxy	

•Decorator	

•Singleton	

•Factory	

•Builder	

•Interpreter
• Template Method
•Strategy	

•Observer	

•Composite	

•Iterator	

•Command	

•Adapter	

•Proxy	

•Decorator	

•Singleton	

•Factory	

•Builder	

•Interpreter
class Report!
def initialize!
@title = 'Monthly Report'!
@text = ['Things are going', 'really, really well.']!
end!
!
def output_report(format)!
if format == :plain!
puts("*** #{@title} ***")!
elsif format == :html!
puts('<html>')!
puts(' <head>')!
puts(" <title>#{@title}</title>")!
puts(' </head>')!
puts(' <body>')!
else!
raise "Unknown format: #{format}"!
end!
!
@text.each do |line|!
if format == :plain!
puts(line)!
else!
puts(" <p>#{line}</p>" )!
end!
end!
!
if format == :html!
puts(' </body>')!
puts('</html>')!
end!
end!
end!
class Report!
def initialize!
@title = 'Monthly Report'!
@text = ['Things are going', 'really, really well.']!
end!
!
def output_report!
output_start!
output_head!
output_body_start!
@text.each do |line|!
output_line(line)!
end!
output_body_end!
output_end!
end!
!
def output_start!
end!
!
def output_head!
raise 'Called abstract method: output_head'!
end!
!
def output_body_start!
end!
!
def output_line(line)!
raise 'Called abstract method: output_line'!
end!
!
def output_body_end!
end!
!
def output_end!
end!
end!
Template method
class HTMLReport < Report!
def output_start!
puts('<html>')!
end!
!
def output_head!
puts(' <head>')!
puts(" <title>#{@title}</title>")!
puts(' </head>')!
end!
!
def output_body_start!
puts('<body>')!
end!
!
def output_line(line)!
puts(" <p>#{line}</p>")!
end!
!
def output_body_end!
puts('</body>')!
end!
!
def output_end!
puts('</html>')!
end!
end!
•Template Method	

• Strategy
•Observer	

•Composite	

•Iterator	

•Command	

•Adapter	

•Proxy	

•Decorator	

•Singleton	

•Factory	

•Builder	

•Interpreter
class Report!
attr_reader :title, :text!
attr_accessor :formatter!
!
def initialize(formatter)!
@title = 'Monthly Report'!
@text = ['Things are going', 'really, really well.']!
@formatter = formatter!
end!
!
def output_report!
@formatter.output_report(self)!
end!
end!
!
Report.new(HTMLFormatter.new)
class HTMLFormatter!
def output_report(context)!
puts('<html>')!
puts(' <head>')!
# Output The rest of the report ...!
!
puts(" <title>#{context.title}</title>")!
puts(' </head>')!
puts(' <body>')!
context.text.each do |line|!
puts(" <p>#{line}</p>")!
end!
puts(' </body>')!
!
puts('</html>')!
end!
end!
•Template Method	

•Strategy	

• Observer
•Composite	

•Iterator	

•Command	

•Adapter	

•Proxy	

•Decorator	

•Singleton	

•Factory	

•Builder	

•Interpreter
class User!
def save!
save_to_database!
if new_record?!
notify_observers(:after_create)!
end!
notify_observers(:after_save)!
end!
end!
!
class UserEmailObserver!
def after_create(user)!
UserMailer.welcome_email(user)!
end!
end!
!
user = User.new!
user.add_observer(UserEmailObserver.new)!
•Template Method	

•Strategy	

•Observer	

• Composite
•Iterator	

•Command	

•Adapter	

•Proxy	

•Decorator	

•Singleton	

•Factory	

•Builder	

•Interpreter
class Task!
attr_reader :name!
!
def initialize(name)!
@name = name!
end!
!
def get_time_required!
0.0!
end!
end
class CompositeTask < Task !
def initialize(name)!
super(name)!
@sub_tasks = []!
end!
!
def add_sub_task(task)!
@sub_tasks << task!
end!
!
def remove_sub_task(task)!
@sub_tasks.delete(task)!
end!
!
def get_time_required!
time=0.0!
@sub_tasks.each {|task| time += task.get_time_required}!
time!
end!
end!
class MakeCakeTask < CompositeTask!
def initialize!
super('Make cake')!
add_sub_task( MakeBatterTask.new )!
add_sub_task( FillPanTask.new )!
add_sub_task( BakeTask.new )!
add_sub_task( FrostTask.new )!
add_sub_task( LickSpoonTask.new )!
end!
end!
!
MakeCakeTask.new.get_time_required
•Template Method	

•Strategy	

•Observer	

•Composite	

• Iterator
•Command	

•Adapter	

•Proxy	

•Decorator	

•Singleton	

•Factory	

•Builder	

•Interpreter
External
array = ['red', 'green', 'blue']!
!
i = ArrayIterator.new(array)!
while i.has_next?!
puts "item: #{i.next_item}"!
end!
Hello Java ;-)
Internal
array = ['red', 'green', 'blue']!
array.each do |item|!
puts "item: #{item}"!
end!
External
array1 = [1, 2]!
array1 = [2, 3]!
!
sum = 0!
i1 = ArrayIterator.new(array1)!
i2 = ArrayIterator.new(array2)!
while i1.has_next? && i2.has_next?!
sum += i1.next_item * i2.next_item!
end!
•Template Method	

•Strategy	

•Observer	

•Composite	

•Iterator	

• Command
•Adapter	

•Proxy	

•Decorator	

•Singleton	

•Factory	

•Builder	

•Interpreter
PrimerTemplate Method
class SlickButton!
def on_button_push!
raise "Abstract method on_button_push"!
end!
end!
!
class SaveButton < SlickButton!
def on_button_push!
document.save(filename)!
end!
end
So many subclasses :-(
class SlickButton!
attr_accessor :command!
!
def initialize(command)!
@command = command!
end!
!
def on_button_push!
@command.execute if @command!
end!
end!
!
class SaveCommand!
def execute!
# Save the current document...!
end!
end!
Command Pattern
class SlickButton!
attr_accessor :command!
!
def initialize(&block)!
@command = block!
end!
!
def on_button_push!
@command.call if @command!
end!
end!
!
save_button = SlickButton.new do!
document.save(filename)!
end!
Lambda
Composite, Command
PRIMER - INSTALLER
class Command!
attr_reader :description!
!
def initialize(description)!
@description = description!
end!
!
def execute!
end!
!
def unexecute!
end!
end!
!
class CreateFile < Command!
def initialize(path, contents)!
super "Create file: #{path}"!
@path = path!
@contents = contents!
end!
!
def execute!
f = File.open(@path, "w")!
f.write(@contents)!
f.close!
end!
!
def unexecute!
File.delete(@path)!
end!
end!
class CompositeCommand < Command!
def initialize!
@commands = []!
end!
!
def add_command(cmd)!
@commands << cmd!
end!
!
def execute!
@commands.each { |cmd| cmd.execute }!
end!
!
# ...!
!
def unexecute!
@commands.reverse.each { |cmd| cmd.unexecute }!
end!
!
# ...!
!
def description!
description = ''!
@commands.each { |cmd| description += cmd.description + "n" }!
return description!
end!
end!
class Installer < CompositeCommand!
def initialize!
add_command(CreateFile.new("file1.txt", "hello worldn"))!
add_command(CopyFile.new("file1.txt", "file2.txt"))!
add_command(DeleteFile.new("file1.txt"))!
end!
end!
!
installer = Installer.new!
installer.execute!
puts installer.description!
•Template Method	

•Strategy	

•Observer	

•Composite	

•Iterator	

•Command	

• Adapter
•Proxy	

•Decorator	

•Singleton	

•Factory	

•Builder	

•Interpreter
class Database!
def initialize(adapter)!
@adapter = adapter!
end!
!
def create_table(table_name, fields)!
@adapter.create_table(table_name)!
fields.each_pair do |name, type|!
@adapter.create_column(table_name, name, type)!
end!
end!
end!
!
db = Database.new(MySQLAdapter.new(DB_URI))!
db.create_table(:users, email: :string)!
•Template Method	

•Strategy	

•Observer	

•Composite	

•Iterator	

•Command	

•Adapter	

• Proxy
•Decorator	

•Singleton	

•Factory	

•Builder	

•Interpreter
class AccountProtectionProxy!
def initialize(real_account, owner_name)!
@subject = real_account!
@owner_name = owner_name!
end!
!
def withdraw(amount)!
check_access!
return @subject.withdraw(amount)!
end!
!
def check_access!
if Etc.getlogin != @owner_name !
raise "Illegal access: #{Etc.getlogin} cannot
access account."!
end!
end!
end!
•Template Method	

•Strategy	

•Observer	

•Composite	

•Iterator	

•Command	

•Adapter	

•Proxy	

• Decorator
•Singleton	

•Factory	

•Builder	

•Interpreter
class UserDecorator!
attr_reader :user!
delegate :first_name, :last_name,!
:position, :institution, to: :user!
!
def initialize(user)!
@user = user!
end!
!
def short_name!
"#{first_name[0]}. #{last_name}"!
end!
!
def description!
"#{short_name} is a #{position} at
#{institution}"!
end!
end!
<p>!
<b>Name:<b>!
{{short_name}}!
<br>!
{{description}}!
<p>!
•Template Method	

•Strategy	

•Observer	

•Composite	

•Iterator	

•Command	

•Adapter	

•Proxy	

•Decorator	

• Singleton
•Factory	

•Builder	

•Interpreter
class SimpleLogger!
@@instance = SimpleLogger.new!
!
def self.instance!
return @@instance!
end!
!
def warn(s)!
puts s!
end!
end!
!
SimpleLogger.instance.warn("I don't know what I'm doing")!
•Template Method	

•Strategy	

•Observer	

•Composite	

•Iterator	

•Command	

•Adapter	

•Proxy	

•Decorator	

•Singleton	

• Factory
•Builder	

•Interpreter
factory :user do!
first_name 'John'!
last_name 'Doe'!
admin false!
!
factory :admin do!
admin true!
end!
end!
!
FactoryGirl.build(:user)!
FactoryGirl.build(:admin)!
•Template Method	

•Strategy	

•Observer	

•Composite	

•Iterator	

•Command	

•Adapter	

•Proxy	

•Decorator	

•Singleton	

•Factory	

• Builder
•Interpreter
user = UserBuilder.new('John', 'Doe')!
.age(30)!
.phone('1234567')!
.address('Fake address 1234')!
.build()!
Hello Java ;-)
•Template Method	

•Strategy	

•Observer	

•Composite	

•Iterator	

•Command	

•Adapter	

•Proxy	

•Decorator	

•Singleton	

•Factory	

•Builder	

• Interpreter
AST (Abstract SyntaxTree)	

querying stuff, building SQL, etc.
# Files that are bigger than 20KB and not writable,!
# or are mp3 files!
expr = Or.new(!
And.new(Bigger.new(20.kilobytes), Not.new(Writable.new)),!
FileName.new('*.mp3'))!
expr.evaluate # => [File, File, ...]!
•teamleadi določite enega ki naj v naslednji 1 uri
uporabi na projektu enega od patternov	

•checkmarks

More Related Content

PDF
Operations Tooling for UI - DevOps for CSS Developers
PDF
Why use Ruby and Rails?
PPTX
Engagement rings history -Moyerfine Jewelers
PDF
Nomethoderror talk
PPS
Sam marcelono
PDF
U.S. Postal Service Annual Report 2012 - "Earthscapes: Seeing Our World in a ...
DOCX
Seismic load (1)
PDF
Perfect Code
Operations Tooling for UI - DevOps for CSS Developers
Why use Ruby and Rails?
Engagement rings history -Moyerfine Jewelers
Nomethoderror talk
Sam marcelono
U.S. Postal Service Annual Report 2012 - "Earthscapes: Seeing Our World in a ...
Seismic load (1)
Perfect Code

Similar to Techtalk design patterns (20)

PDF
Refactoring Workshop (Rails Pacific 2014)
PDF
Test Driven Development - Workshop
PDF
Introduction to Drupal (7) Theming
PPTX
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
PPTX
TypeScript . the JavaScript developer best friend!
PDF
Ingo Muschenetz: Titanium Studio Deep Dive
PDF
Coder sans peur du changement avec la meme pas mal hexagonal architecture
PDF
Introduction to JavaScript design patterns
PDF
Refactoring
PDF
Milot Shala - C++ (OSCAL2014)
PDF
Pruexx User's guide for beta testing
PDF
Drupal module development
PDF
Real World Selenium Testing
PDF
RubyConf Portugal 2014 - Why ruby must go!
PDF
Oreilly
PPTX
Continuous improvements of developer efficiency with modern IDE
PDF
HTML5 Is the Future of Book Authorship
PDF
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
PDF
Writing clean code
PDF
Play framework: lessons learned
Refactoring Workshop (Rails Pacific 2014)
Test Driven Development - Workshop
Introduction to Drupal (7) Theming
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
TypeScript . the JavaScript developer best friend!
Ingo Muschenetz: Titanium Studio Deep Dive
Coder sans peur du changement avec la meme pas mal hexagonal architecture
Introduction to JavaScript design patterns
Refactoring
Milot Shala - C++ (OSCAL2014)
Pruexx User's guide for beta testing
Drupal module development
Real World Selenium Testing
RubyConf Portugal 2014 - Why ruby must go!
Oreilly
Continuous improvements of developer efficiency with modern IDE
HTML5 Is the Future of Book Authorship
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
Writing clean code
Play framework: lessons learned
Ad

Recently uploaded (20)

PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PPTX
Big Data Technologies - Introduction.pptx
PDF
Encapsulation theory and applications.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPT
Teaching material agriculture food technology
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Machine learning based COVID-19 study performance prediction
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Approach and Philosophy of On baking technology
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Electronic commerce courselecture one. Pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PPTX
Spectroscopy.pptx food analysis technology
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
“AI and Expert System Decision Support & Business Intelligence Systems”
Big Data Technologies - Introduction.pptx
Encapsulation theory and applications.pdf
Spectral efficient network and resource selection model in 5G networks
Advanced methodologies resolving dimensionality complications for autism neur...
Teaching material agriculture food technology
A comparative analysis of optical character recognition models for extracting...
Machine learning based COVID-19 study performance prediction
Encapsulation_ Review paper, used for researhc scholars
Approach and Philosophy of On baking technology
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Building Integrated photovoltaic BIPV_UPV.pdf
sap open course for s4hana steps from ECC to s4
Electronic commerce courselecture one. Pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Review of recent advances in non-invasive hemoglobin estimation
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Spectroscopy.pptx food analysis technology
Unlocking AI with Model Context Protocol (MCP)
The Rise and Fall of 3GPP – Time for a Sabbatical?
Ad

Techtalk design patterns