Chapter3: 策略模式(Strategy Pattern)

文章推薦指數: 80 %
投票人數:10人

1.Strategy Pattern. 2.Strategy Pattern Example ... 若使用策略模式來套用上述範例, 則可以解決繼承所帶來的問題, 也可以重複使用已經寫好的程式碼:. DDDesignPatternSearch…DDDesignPatternIntroductionChapter1:MVVMChapter2:觀察者模式(ObserverPattern)Chapter3:策略模式(StrategyPattern)Chapter4:單例/獨體模式(Singleton)Chapter5:裝飾者模式(DecoraterPattern)Chapter6:命令模式(CommandPattern)Chapter7:MVCPoweredByGitBookChapter3:策略模式(StrategyPattern)Thissectioncontainthefollowingitems:1.StrategyPattern2.StrategyPatternExample1.StrategyPattern策略模式所要解決的問題(痛點)1.在一個專案中的不同物件,如果其80%屬性相同,但在某些方面有差異,若全部分為不同的類別來寫,勢必會造成維護不易及程式碼不一致的問題.2.在一個專案中的不同物件,其屬性有互相重複使用的情形.例如有三個動物,A,B的叫聲相同,B,C的飛行方式相同,如果分別實作三個class,則會有很多function是重複的.我們已經知道code重複的後遺症:維護不易,無法維持一致性.​​3.如果為了解決2的問題,使用繼承,考量下面一種情況可能會發生:A動物並不會飛,D動物也不會叫,這麼一來必須在這兩個類別的這些function中取消繼承而來的行為,一個漏掉就會變成bug;而且重複的function還是必須得複製貼上,如A,B的叫聲相同,一樣會有維護不異,無法維持一致性的問題.​​策略模式的核心概念1.找出程式中可能需要變動之處,把他們獨立出來,不要與那些不需要更動的程式碼混在一起.例如:​​可以這樣拆分class:​​2.寫程式是針對介面(超類別)而寫,而不是針對實踐方法而寫介面,超類別,多型:實體化的動作不再需要程式碼中僵化固定成某型態,而是在runtime時才決定:​​1Animalanimal=newdog();2animal.makeSound();Copied!合成代替繼承若使用策略模式來套用上述範例,則可以解決繼承所帶來的問題,也可以重複使用已經寫好的程式碼:​​2.StrategyPatternExample:以Javascript為例:​1.以物件導向模式的寫法實作:架構上可分為策略物件與主體物件​1//策略類別2varanimalA=function(){};3animalA.prototype.bark=function(){4return"呱呱"5}6animalA.prototype.fly=function(){7return"展翅高飛"8}9​10varanimalB=function(){};11animalB.prototype.bark=function(){12return"呱呱"13}14animalB.prototype.fly=function(){15return"滑翔"16}17​18varanimalC=function(){};19animalC.prototype.bark=function(){20return"嘰嘰"21}22animalC.prototype.fly=function(){23return"滑翔"24}25​26//主體類別27varanimal=function(){28this.animal=null;29}30animal.prototype.setType=function(animal){31this.animal=animal;32}33animal.prototype.bark=function(){34console.log(this.animal.bark());35}36animal.prototype.fly=function(){37console.log(this.animal.fly());38}39​40//test41varlittleAnimal=newanimal();42littleAnimal.setType(newanimalA());43littleAnimal.bark();44littleAnimal.fly();Copied!​​​2.以Javascript的寫法實作​1//2.以Javascript的寫法實作2//策略物件3varbarks={4"animalA":function(){5return"呱呱"6},7"animalB":function(){8return"呱呱"9},10"animalC":function(){11return"嘰嘰"12}13}14​15varflys={16"animalA":function(){17return"展翅高飛"18},19"animalB":function(){20return"滑翔"21},22"animalC":function(){23return"滑翔"24}25}26​27//主體物件28varaction=function(actions,type){29console.log(actions[type]());30}31​32action(barks,"animalA")33action(flys,"animalA")Copied!​​PreviousChapter2:觀察者模式(ObserverPattern)NextChapter4:單例/獨體模式(Singleton)Lastmodified2yragoCopylinkContentsThissectioncontainthefollowingitems:1.StrategyPattern2.StrategyPatternExample:



請為這篇文章評分?