模板模式固然不錯,但其還是有一些缺陷的。比如其實現依賴於繼承並且缺足夠的靈活性。在這時候我們就需要找到乙個更加優化的解決方案——策略模式。
下面是使用策略模式實現的report模板
1#策略1
2class
htmlformatter
3def
output_report title, text
4 puts '
'5 puts '
'8 puts '
'9 text.each do |line|
10 puts "#"
11end
12 puts '
'13 puts ''14
end15
end1617#
策略218
class
plaintextformatter
19def
output_report title, text
20 puts '
********
' + title + '
********
'21 text.each do |line|
22puts line
23end
24end
25end
2627#環境
28class
reporter
29attr_reader :title, :text
30attr_accessor :formater
3132
definitialize formater
33 @title = '
my report
'34 @text = ['
this is my report
', '
please see the report
', '
it is ok']
35 @formater =formater
36end
3738
#可以把指向自己的引用傳入策略中,這樣做雖然簡化了資料流動,但是增加了環境和策略之間的耦合
39def
output_report
[email protected]_report @title, @text41#
@formater.output_report self
42end
4344
end45
46reporter.new(htmlformatter.new).output_report
47reporter.new(plaintextformatter.new).output_report
4849
#再來回頭說模板方法模式,50#
模板方法模式,是尋找共同,然後提取出模板51#
策略模式,是將不同的方法封裝成乙個策略,這些策略不盡相同,難以提取共同部分
5253
#如果策略足夠簡單,僅有乙個方法,那麼可以通過**塊傳遞
54class
procreporter
55attr_reader :title, :text
56attr_accessor :formatter
5758
def initialize &formatter
59 @title = '
my report
'60 @text = ['
this is my report
', '
please see the report
', '
it is ok']
61 @formatter =formatter
62end
6364
#可以把指向自己的引用傳入策略中,這樣做雖然簡化了資料流動,但是增加了環境和策略之間的耦合
65def
output_report
[email protected] self
67end
6869
end70
71 report_html = procreporter.new do |context|
72 puts '
'73 puts '
'76 puts '
'77 context.text.each do |line|
78 puts "#"
79end
80 puts '
'81 puts ''82
end83
p report_html.output_report
8485
#乙個簡單的輕量級策略物件的好例子
86 a = ['
1','
12','
123','
6234567
','3
','13']
87p a.sort
88 p a.sort
透析設計模式中的 策略模式
一 目的 策略模式主要是用來封裝演算法的,當需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。二 策略模式的原理 乙個父類,下面有幾個子類繼承父類實現多型 乙個策略類 在建構函式中傳參,直接判斷需要生成哪個子類 並且在另乙個方法中呼叫指定子類的方法 完成不同的演算法 業務...
透析設計模式中的 策略模式
一 目的 策略模式主要是用來封裝演算法的,當需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。二 策略模式的原理 乙個父類,下面有幾個子類繼承父類實現多型 乙個策略類 在建構函式中傳參,直接判斷需要生成哪個子類 並且在另乙個方法中呼叫指定子類的方法 完成不同的演算法 業務...
設計模式 策略設計模式
策略設計模式其實就是多型的使用,父類引用指向子類物件。策略模式的最大特點是使得演算法可以在不影響客戶端的情況下發生變化,從而改變不同的功能。策略模式的缺點其實也很明顯,在於策略模式把每一種具體的策略都封裝成乙個實現類,如果策略有很多的話,很顯然是實現類就會導致過多,顯得臃腫。案列 author de...