Ruby/Design Patterns/Strategy
Материал из Wiki.crossplatform.ru
(Различия между версиями)
Версия 17:10, 26 мая 2010
Replacing the Algorithm with the Strategy
class Formatter def output_report( title, text ) raise "Abstract method called" end end class HTMLFormatter < Formatter def output_report( title, text ) puts("<html>") puts(" <head>") puts(" <title>#{title}</title>") puts(" </head>") puts(" <body>") text.each do |line| puts(" <p>#{line}</p>" ) end puts(" </body>") puts("</html>") end end class PlainTextFormatter < Formatter def output_report(title, text) puts("#{title}") text.each do |line| puts(line) end end end class Document attr_reader :title, :text attr_accessor :formatter def initialize(formatter) @title = "Document" @text = [ "Things are going", " well." ] @formatter = formatter end def output_report @formatter.output_report( @title, @text ) end end report = Document.new(HTMLFormatter.new) report.output_report report.formatter = PlainTextFormatter.new report.output_report
Sharing Data between the Context and the Strategy
class Document attr_reader :title, :text attr_accessor :formatter def initialize(formatter) @title = "Document" @text = ["Things are going", " well."] @formatter = formatter end def output_report @formatter.output_report(self) end end class Formatter def output_report(context) raise "Abstract method called" end end class HTMLFormatter < Formatter def output_report(context) puts("<html>") puts(" <head>") 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
Strategy pattern with Ruby dynamic attributes
class Document attr_reader :title, :text attr_accessor :formatter def initialize(formatter) @title = "Your Document" @text = ["Things are going", "really, really well."] @formatter = formatter end def output_report() @formatter.output_report(self) end end class HTMLFormatter def output_report(context) puts("<html>") puts(" <head>") 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 class PlainTextFormatter def output_report(context) puts("#{context.title}") context.text.each do |line| puts(line) end end end