前言
設計模式有很多,但設計模式的目的是一致的,都是為了提升代碼的可讀性和可擴展性。設計模式都遵循一些基本的原則,設計模式是為了遵循這些原則而創造的工具。
- 單一職責原則:就一個類而言,應該僅有一個引起它變化的原因。這一點是說,如果有一些類過於臃腫,承擔了過多的職責,就應當分解他。
- 開放-封閉原則:軟件實體(類、模塊、函數等)應該可以擴展,但是不可修改。這一點是說,拒絕硬編碼,拒絕直接修改原有代碼。
- 依賴倒轉原則:高層模塊不應該以來低層模塊。兩個都應該以來抽象。抽象不應該依賴細節。細節應該依賴抽象。這一點是說,應該使用面向接口編程。
這些原則是程序員在協同工作中達成的共識,就算大家從來沒有學習過什么設計模式,只要能遵循這些原則,也許你自己已經使用了某些設計模式。
有三個模式我以前學習的時候很混淆,他們是策略模式、代理模式、裝飾者模式。混淆的原因是,這三個模式都是在 輔助類中持有一個目標類的對象,通過操作這個目標對象,完成實際任務。
在工作中具體場景下深入思考以后,我終於對他們有了進一步的理解。
首先來看策略模式,uml類圖如下
策略模式通過將一些易變的計算抽象為策略實體,通過多態,讓實際調用者盡可能的不用感知這種變化。
再看代理模式
代理模式與策略模式不同的是,代理類必須和被代理類具有相同的父類或接口,即代理類要么繼承或實現被代理類的父類,要么直接計程被代理類本身。這兩種情況分別對應java的jdk代理和cglib代理實現。
代理模式不是為了封裝變化,而是為了隱藏實際執行者本身。
最后是裝飾者模式
裝飾者模式和策略模式的不同在於,原有類和裝飾器類必須繼承同一個父類。裝飾器對象除了需要完成持有對象的操作外,還有一些附加操作,這些附加操作隨着裝飾器的不同而變化。持有對象本身的操作是主體,裝飾器的操作是補充。而策略模式中,具體策略才是主體。