外觀設計模式在平常的代碼編寫中,會經常使用。在平常代碼的編寫時,即使程序員沒有從標準上認識過外觀設計模式,但在開發的過程中,也會從代碼的多方面角度考慮,從而編寫了符合外觀設計模式的代碼。
很多程序員都有這種感覺,在學習一些自認爲沒有了解的技術時,發現自己已經接觸過了一部分內容,這一部分內容有標準上書面上有着準確的定義。
擁有豐富項目經驗的程序員,在考慮了項目整體代碼架構、性能優化等方面後,編寫的程序將和一些標準定義的技術發生雷同。
學習設計模式,是促進相關技術的增長,但是在沒有豐富的項目經驗前,很大一部分學習了設計模式的開發者,將不懂如何使用設計模式融入到自己的代碼編寫之中。所以我寫的設計模式文章,大多數只是簡單的實現了設計模式,並不會把多餘的內容加入到實現之中。因爲我的觀點是“徐徐漸進,在有了項目經驗後,在進一步考慮項目的優化迭代”。
迴歸正題,開始講解外觀設計模式。
外觀設計模式,簡單的來說,是通過編寫一個簡單的接口,不暴露系統的複雜性,增加這個系統的易用性,屏蔽內部實現。
在日常開發中,屏蔽系統內部實現是經常做的事情,所以對於一部分開發者來說,外觀設計模式是在項目中經常使用的技術。接下來就來看一下外觀設計模式的基本實現。
例:通過一個按鈕,控制空調的啓動。
分析空調的啓動可以簡要的分爲以下步驟:點擊按鈕——>收到點擊按鈕的信號——>開啓製冷——>開啓溫度檢測自動調溫。
我們首先新建一個製冷器與溫度計類,模擬製冷器與溫度計的啓動:
#製冷器
class Refrigerator():
def start(self):
print('製冷器啓動...')
def stop(self):
print('製冷器停止...')
#溫度計
class Thermometer():
def start(self):
print("溫度計啓動...")
def stop(self):
print("溫度計停止...")
常規情況下,我們可以直接調用製冷器後再調用溫度計,這個時候就比較麻煩,內部系統暴露出來,使用極其繁瑣。
接下來新建一個空調類,用以統一調用這兩個類,實現製冷的開始。
#空調類
class AirConditioner():
#初始化
def __init__(self):
self.refrigerator=Refrigerator()
self.thermometer=Thermometer()
#開始鍵按下
def startBtnClick():
print('空調啓動鍵按下...')
self.start()
#停止鍵按下
def stopBtnClick():
print('空調關閉鍵按下...')
self.stop()
#開始方法
def start(self):
print('空調啓動...')
self.refrigerator.start()
self.thermometer.start()
#停止方法
def stop(self):
print('空調停止...')
self.refrigerator.stop()
self.thermometer.stop()
以上的空調類中,初始化中實例化了製冷器類與溫度計檢測類,在開始按鈕點擊的方法中,啓動了開始方法,開始方法打開了製冷器與溫度檢測;同理,停止方法也是如此。調用方法如下:
ac=AirConditioner()
ac.start()
新建空調後,開始即可,查看運行效果:
最後查看完整的代碼:
#空調類
class AirConditioner():
#初始化
def __init__(self):
self.refrigerator=Refrigerator()
self.thermometer=Thermometer()
#開始鍵按下
def startBtnClick():
print('空調啓動鍵按下...')
self.start()
#停止鍵按下
def stopBtnClick():
print('空調關閉鍵按下...')
self.stop()
#開始方法
def start(self):
print('空調啓動...')
self.refrigerator.start()
self.thermometer.start()
#停止方法
def stop(self):
print('空調停止...')
self.refrigerator.stop()
self.thermometer.stop()
#製冷器
class Refrigerator():
def start(self):
print('製冷器啓動...')
def stop(self):
print('製冷器停止...')
#溫度計
class Thermometer():
def start(self):
print("溫度計啓動...")
def stop(self):
print("溫度計停止...")
ac=AirConditioner()
ac.start()