ruby中的設計模式 策略模式

2022-08-28 12:45:10 字數 2537 閱讀 9715

模板模式固然不錯,但其還是有一些缺陷的。比如其實現依賴於繼承並且缺足夠的靈活性。在這時候我們就需要找到乙個更加優化的解決方案——策略模式。

下面是使用策略模式實現的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...