設計模式(2)- 深入淺出設計模式 閱讀筆記
命令模式
命令模式就是不改變原有程式碼,而在原有程式碼的基礎之上封裝一層,為每個命令建立一個
類,而這個類又實現了統一的一個介面。例如我們有電燈,電風扇,他們的開關方法
分別叫light
,lights_out
,on
,off
。
用Python描述:
class Light: def light(self): print("light on...") def lights_off(self): print("lights off...") class Fan: def on(self): print("fan on...") def off(self): print("fan off...") class Command: def execute(self): raise NotImplemented() class LightOnCommand(Command, Light): def execute(self): self.light() class LightOffCommand(Command, Light): def execute(self): self.lights_off() class FanOnCommand(Command, Fan): def execute(self): self.on() class FanOffCommand(Command, Fan): def execute(self): self.off() if __name__ == "__main__": LightOnCommand().execute() LightOffCommand().execute() FanOnCommand().execute() FanOffCommand().execute()
執行結果:
$ python command.py light on... lights off... fan on... fan off...
用Java描述:
// Fan.java public class Fan { public void on() { System.out.println("fan on..."); } public void off() { System.out.println("fan off..."); } } // Light.java public class Light { public void light() { System.out.println("light on..."); } public void lights_off() { System.out.println("light off..."); } } // Command.java public interface Command { public void execute(); } // LightOnCommand.java public class LightOnCommand implements Command { Light light; public LightOnCommand(Light light) { this.light = light; } public void execute() { light.light(); } } // LightOffCommand.java public class LightOffCommand implements Command { Light light; public LightOffCommand (Light light) { this.light = light; } public void execute() { light.lights_off(); } } // FanOnCommand.java public class FanOnCommand implements Command { Fan fan; public FanOnCommand(Fan fan) { this.fan = fan; } public void execute() { fan.on(); } } // FanOffCommand.java public class FanOffCommand implements Command { Fan fan; public FanOffCommand(Fan fan) { this.fan = fan; } public void execute() { fan.off(); } } // Main.java public class Main { public static void main(String[] args) { Light light = new Light(); Fan fan = new Fan(); LightOnCommand lightOnCommand = new LightOnCommand(light); LightOffCommand lightOffCommand = new LightOffCommand(light); lightOnCommand.execute(); lightOffCommand.execute(); FanOnCommand fanOnCommand = new FanOnCommand(fan); FanOffCommand fanOffCommand = new FanOffCommand(fan); fanOnCommand.execute(); fanOffCommand.execute(); } }
執行結果:
$ javac *.java && java Main light on... light off... fan on... fan off...
介面卡模式
介面卡模式要理解起來就比較簡單,就是通過介面卡,把兩個原本不相容的類通過 介面卡轉換,達成可以單向或雙向呼叫。典型的生活中的例子就是,例如假設我買了 一個港版的iPhone,隨機附贈的充電頭也是港版的,使用電壓和大陸不一樣,插頭 也不一樣,所以就要購買一個轉換介面,把國標插頭轉換成港版插頭能用的插頭。
模板方法模式
模板方法就是規定了大概的步驟,但是留有細節步驟讓子類去實現。例如某排程系統 可能要求支援多種演算法,但是大體步驟都是相似的,於是就可以通過模板方法模式把 相似的步驟都寫下來,然後把具體細節實現留給子類完成。當最後呼叫的時候就會根據 例項化不同而產生不同細節上的效果。
迭代器模式
用Python的同學想必對迭代器非常的熟悉,我們的類只要實現了__iter__
和__next__
協議,就可以用於 for 迴圈中。
狀態模式
狀態模式和策略模式非常的想象,區別在於,策略模式是使用者來設定具體使用哪一種 實現,而狀態模式是由類內部的狀態機來完成的,例如為每一個類都實現可能的操作 會帶來的影響和下一個狀態,於是當啟動狀態機以後,就開始運轉了。
代理模式
代理模式由於涉及Java遠端呼叫,就暫時不上程式碼了,但是要理解起來,很簡單,請看 自己的爬土嗇方法。
最後
看完了《Head First 設計模式》。一直很喜歡《Head First》系列書籍,這本書也不 例外。設計模式是軟體開發過程中常遇到的解決複雜度的一些方法,經過總結,而得出 來的“模式”。雖然看完了這本書,但是真正掌握他們還得在 “寫程式碼-思考-領悟設計模式”的迴圈中才能掌握。