常用設計模式有23中,分為:
建立型模式(主要用於建立物件)
1、單例模式
2、工廠方法模式
3、抽象工廠模式
4、建造者模式
5、原型模式
行為型模式 (主要用於描述物件或類是怎樣互動和怎樣分配職責)
1、模板方法模式
2、中介者模式
3、命令模式
4、責任鏈模式
5、策略模式
6、迭代器模式
7、觀察者模式
8、備忘錄模式
9、訪問者模式
10、狀態模式
11、直譯器模式
結構型模式(主要用於處理類或物件的組合)
1、**模式
2、裝飾模式
3、介面卡模式
4、組合模式
5、外觀模式(門面模式)
6、享元模式
7、橋梁模式
策略模式
策略模式(strategy pattern)是一種比較簡單的模式,也叫做政策模式(policy
pattern)。其定義如下:
定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。
策略模式使用的就是物件導向的繼承和多型機制, 策略模式的三個角色:
● context封裝角色
它也叫做上下文角色,起承上啟下封裝作用,遮蔽高層模組對策略、演算法的直接訪問,封裝可能存在的變化。
● strategy抽象策略角色
策略、演算法家族的抽象,通常為介面,定義每個策略或演算法必須具有的方法和屬性。
各位看官可能要問了,類圖中的
algorithminte***ce是什麼意思?
algorithm是
「運算法則
」的意思,結合起來意思就明白了吧。
● concretestrategy具體策略角色
實現抽象策略中的操作,該類含有具體的演算法。
策略模式的通用原始碼
先看抽象策略角色,它是乙個非常普通的介面,定義乙個或多個具體的演算法,
如**清單
18-7所示。
**清單18-7 抽象的策略角色
public inte***ce strategy
具體策略也是非常普通的乙個實現類,只要實現介面中的方法就可以,如**清單18-8
所示。
**清單18-8 具體策略角色
public class concretestrategy1 implements strategy
}public class concretestrategy2 implements strategy
}
策略模式的重點就是封裝角色,它是借用了**模式的思路,
大家可以想想,它和**模式有什麼差別,差別就是策略模式的封裝角色和被封裝的策略類不用是同乙個介面,如果
是同乙個介面那就成為了**模式。
我們來看封裝角色,如**清單
18-9所示。
**清單18-9 封裝角色
public class context
//封裝後的策略方法
public void doanythinig()
}
高層模組的呼叫非常簡單,知道要用哪個策略,產生出它的物件,然後放到封裝角色中就完成任務了,如**清單
18-10所示。
**清單18-10 高層模組
public class client
}
策略模式就是這麼簡單,它就是採用了物件導向的繼承和多型機制,其他沒什麼玄機。
想想看,你真實的業務環境有這麼簡單嗎?乙個類實現多個介面很正常,你要有
火眼金睛看清楚哪個介面是抽象策略介面,哪些是和策略模式沒有任何關係,這就是你作為系統分析師的價值所在。
優點 ● 演算法可以自由切換
通過封裝角色對其進行封裝,保證對外提供「可自由切換」的策略。
● 避免使用多重條件判斷
簡化了操作,同時避免了條件語句判斷
● 擴充套件性良好 缺點
● 策略類數量增多
● 所有的策略類都需要對外暴露
上層模組必須知道有哪些策略,然後才能決定使用哪乙個策略,這與迪公尺特法則是相違
背的,我只是想使用了乙個策略,我憑什麼就要了解這個策略呢?那要你的封裝類還有什麼
意義?這是原裝策略模式的乙個缺點,幸運的是,我們可以使用其他模式來修正這個缺陷,
如工廠方法模式、**模式或享元模式。
使用場景
● 多個類只有在演算法或行為上稍有不同的場景。
● 演算法需要自由切換的場景。
● 需要遮蔽演算法規則的場景。
注意事項
如果系統中的乙個策略家族的具體策略數量超過4個,則需要考慮使用混合模式,解決策略類膨脹和對外暴露的問題,否則日後的系統維護就會成為乙個燙手山芋
策略列舉
把原有定義在抽象策略中的方法移植到列舉中,每個列舉成員就成為乙個具體策略
**清單18-18 策略列舉
public enum calculator
},//減法運算
sub("-")
};string value = "";
//定義成員值型別
private calculator(string _value)
//獲得列舉成員的值
public string getvalue()
//宣告乙個抽象函式
public abstract int exec(int a,int b);
}
場景類稍有改動
**清單18-19 場景類
public class client
}
注意策略列舉是乙個非常優秀和方便的模式,但是它受列舉型別的限制,每個列舉項
都是public、
final、
static的,擴充套件性受到了一定的約束,因此在系統開發中,策略列舉一般
擔當不經常發生變化的角色。
策略模式是乙個非常簡單的模式。它在專案中使用得非常多,但它單獨使用的地方就比較少了,因為它有致命缺陷:所有的策略都需要暴露出去,這樣才方便客戶端決定使用哪一
個策略
設計模式筆記 策略模式
策略模式 strategy 定義了一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換,在使用時,根據傳入的型別不同,隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法 策略模式和簡單工廠模式的區別 工廠是建立型模式,它的作用就是建立物件,簡單工廠模...
設計模式筆記(三) 策略模式
策略模式 定義的演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。策略模式是一種定義一種演算法的方法,從概念上看,所有這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有演算法,減少了各種演算法類與使用演算法類之間的耦合。優點 第...
設計模式學習筆記 策略模式
我覺得策略模式與工廠方法模式極其相似!策略模式 工廠方法模式 如果單從圖來看,看不出有何相似之處。但看看呼叫方法就知道了 策略模式 context context new context abstractstrategy strategy 採用哪種策略,由呼叫方決定 strategy new con...