策略模式(strategy) 屬于對象的行為模式。
1. 定義
定義一系列的算法,把這些算法一個個封裝成單獨的類.策略模式是對算法的封裝,是把使用算法的責任和算法本身分割開,委派給不同的對象管理.
2. 使用的原因
在某些情況下,當客戶端需求不同時,會要求不同的算法實現,為使算法的增減,修改都不會影響環境和客戶端,可采用策略模式解決此種情況。
3. 適用的情況舉例
1)一電子商務網站對各類書提供不同的折扣算法,有的沒有折扣,有的提供10%的折扣,那么在計算圖書的價格時,為防止通過過多而擴展性差的選擇語句來決定采取何種折扣算法,可采取策略算法有效解決問題;
2)假使你是一推銷員,你腦海中已存儲了很多種推銷方法,每種方法適應一類人群,當你去推銷時,你要根據不同的對象去決定該用何種方式推銷;
3)很多人在追求MM時,會根據不同的MM做出不同的追求策略,有的MM喜歡天南海北的玩,有的MM喜歡肆無忌憚的吃,有的MM喜歡成天成天的打扮,有的......,情場老手會根據具體情況具體分析,而有些不開竅的人,采取統一策略,而且在判斷失誤時不會做出策略改變,導致屢戰屢敗,都是因為策略模式沒學好的結果(啊哈,跟我一起上補習班)。
4. 類圖結構及說明
1) 簡略類圖
2)說明
左上邊的類為環境(Context)角色,它只有一個Strategy類的應用;
右上方的類為抽象策略角色,通常為抽象類或接口;
下方的三個類繼承自抽象策略類,它們屬于不同的具體策略實現類。它們包裝了相關的算法和行為。
5. 應用舉例
1)問題背景
在評議某老師的教學情況時,可能采取如下方式:
讓所教的班的學生對學校定出的評議老師的各項指標進行打分,最后統計該老師所得的平均分數,如果平均分在60分以上,就算教學合格。
還可能采取如下方式:
讓學生在“合格”、“基本合格”和“不合格”中勾選一項,最后統計認為選擇“合格”與“基本合格”的比例,如果超過60%就算教學情況合格。
還可能有其他種方式。
2)考慮方案
a)最不“雅觀"的實現方案
將所有的業務邏輯都放在客戶端中,利用條件選擇語句決定使用哪一個算法。
缺點:當增加新的方式時,需大量修改客戶端代碼,使得客戶端難以維護。
b)比a方案進了一步,考慮在客戶端加入繼承,不同方式的算法在不同的子類中實現,但因此時環境和行為耦合在了一起,造成兩者不能單獨演化。
c)針對b方案的環境和行為耦合在一起了這個缺點,將環境和行為分開。環境負責的工作是負責維護和查詢行為類,而各行為類負責算法的實現。c方案的實現其實就是策略模式的應用。
3)代碼模擬實現
待補充。
參考書籍:《Java與模式》
《Patterns in Java》
FeedBack:
# re: 設計模式學習筆記--策略模式(待續)
2007-04-11 09:13 | 劉甘泉
我來給個實例
//A策略
public class Astragety implements Istragety{
public String doSomething(String ori) {
return ori+"AA";
}
}
//B策略
public class Bstragety implements Istragety{
public String doSomething(String ori) {
return ori+"BB";
}
}
//策略接口
public interface Istragety {
public String doSomething(String ori);
}
//使用策略的上下文
public class StragetyContext {
private Istragety istragety;
public void setIstragety(Istragety istragety) {
this.istragety = istragety;
}
public void doWhatUWant(){
System.out.println(istragety.doSomething("what u want:"));
}
}
//開始使用吧~~~~~
public class Stragety {
public static void main(String[] args) {
StragetyContext stragetyContext = new StragetyContext();
stragetyContext.setIstragety(new Astragety());
stragetyContext.doWhatUWant();
stragetyContext.setIstragety(new Bstragety());
stragetyContext.doWhatUWant();
}
} 回復 更多評論
//A策略
public class Astragety implements Istragety{
public String doSomething(String ori) {
return ori+"AA";
}
}
//B策略
public class Bstragety implements Istragety{
public String doSomething(String ori) {
return ori+"BB";
}
}
//策略接口
public interface Istragety {
public String doSomething(String ori);
}
//使用策略的上下文
public class StragetyContext {
private Istragety istragety;
public void setIstragety(Istragety istragety) {
this.istragety = istragety;
}
public void doWhatUWant(){
System.out.println(istragety.doSomething("what u want:"));
}
}
//開始使用吧~~~~~
public class Stragety {
public static void main(String[] args) {
StragetyContext stragetyContext = new StragetyContext();
stragetyContext.setIstragety(new Astragety());
stragetyContext.doWhatUWant();
stragetyContext.setIstragety(new Bstragety());
stragetyContext.doWhatUWant();
}
} 回復 更多評論
# re: 設計模式學習筆記--策略模式(待續)
# re: 設計模式學習筆記--策略模式(待續)
# re: 設計模式學習筆記--策略模式(待續)
# re: 設計模式學習筆記--策略模式(待續)
# re: 設計模式學習筆記--策略模式(待續)[未登錄]
2007-11-09 11:04 | 阿蜜果
Hi, Steve, you can see this article:
http://www.aygfsteel.com/wangle/archive/2007/04/25/113545.html 回復 更多評論
http://www.aygfsteel.com/wangle/archive/2007/04/25/113545.html 回復 更多評論
只有注冊用戶登錄后才能發表評論。 | ||
![]() |
||
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
|
||
相關文章:
|
||
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
8 | 9 | 10 | 11 | 12 | 13 | 14 | |||
15 | 16 | 17 | 18 | 19 | 20 | 21 | |||
22 | 23 | 24 | 25 | 26 | 27 | 28 | |||
29 | 30 | 1 | 2 | 3 | 4 | 5 |
生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
我的作品:
玩轉Axure RP (2015年12月出版)

Power Designer系統分析與建模實戰 (2015年7月出版)
Struts2+Hibernate3+Spring2 (2010年5月出版)
我的作品:
玩轉Axure RP (2015年12月出版)

Power Designer系統分析與建模實戰 (2015年7月出版)

Struts2+Hibernate3+Spring2 (2010年5月出版)

留言簿(263)
隨筆分類
- Ajax(3)
- Ant(1)
- Auto Code(4)
- Cewolf
- CMMI(1)
- CSS(2)
- CVS(1)
- database(15)
- Design Pattern(11)
- Eclipse BIRT(1)
- EJB
- extremecomponents(1)
- GIS(2)
- Hibernate(8)
- iBATIS(2)
- IDE(1)
- Inno Setup(2)
- IT評論(2)
- Java(36)
- Javascript(32)
- JBoss(1)
- JFreeChart(3)
- JFreeReport(3)
- JSF
- Linux(3)
- MySql(11)
- Open Source(4)
- Oracle(5)
- Other(13)
- Spring(12)
- Sql Server(1)
- Struts(7)
- Struts2(8)
- Tomcat
- UML
- Web(8)
- Web Service(3)
- Workflow
- 產品原型設計(8)
- 似水流年(13)
- 協議(12)
- 原創小說(1)
- 技術評論
- 架構師之路(12)
- 電信知識(3)
- 網絡通信相關(11)
- 職場感悟(6)
- 解決方案(12)
- 項目管理(8)
隨筆檔案
- 2016年3月 (2)
- 2015年11月 (1)
- 2015年9月 (1)
- 2015年6月 (3)
- 2015年5月 (4)
- 2014年12月 (2)
- 2014年7月 (1)
- 2014年6月 (1)
- 2014年5月 (2)
- 2014年1月 (2)
- 2013年10月 (1)
- 2013年8月 (1)
- 2013年7月 (1)
- 2013年4月 (1)
- 2013年2月 (1)
- 2012年11月 (2)
- 2012年10月 (1)
- 2012年1月 (1)
- 2011年11月 (8)
- 2011年10月 (4)
- 2011年9月 (1)
- 2011年8月 (2)
- 2011年7月 (5)
- 2011年2月 (2)
- 2011年1月 (1)
- 2010年12月 (3)
- 2010年11月 (9)
- 2010年9月 (1)
- 2010年7月 (2)
- 2010年6月 (2)
- 2010年5月 (5)
- 2010年4月 (2)
- 2009年12月 (4)
- 2009年11月 (2)
- 2009年10月 (1)
- 2009年9月 (3)
- 2009年8月 (5)
- 2009年7月 (5)
- 2009年5月 (1)
- 2008年10月 (3)
- 2008年9月 (3)
- 2008年8月 (1)
- 2008年6月 (2)
- 2008年5月 (3)
- 2008年4月 (2)
- 2008年2月 (2)
- 2008年1月 (11)
- 2007年12月 (9)
- 2007年11月 (7)
- 2007年10月 (9)
- 2007年9月 (12)
- 2007年8月 (24)
- 2007年7月 (10)
- 2007年6月 (2)
- 2007年5月 (3)
- 2007年4月 (18)
- 2007年3月 (24)
- 2007年2月 (24)
文章分類
相冊
關注blog
積分與排名
- 積分 - 2296376
- 排名 - 3
最新評論

- 1.?re: 新書推薦:《Power Designer系統分析與建模實戰》
-
你好。買了書,麻煩把書中的樣例工程文件發給我。非常感謝。
我的郵箱:wen027andy@163.com - --文良
- 2.?re: 新書推薦:《Power Designer系統分析與建模實戰》
-
@智祿
謝謝指出,下次改版修正:) - --阿蜜果
- 3.?re: 新書推薦:《Power Designer系統分析與建模實戰》
-
6.1.3 9.存儲函數
存儲函數與存儲函數類似,……
此處應該是:存儲函數與存儲過程類似,……
我買的是多看上的電子版,請修改
- --智祿
- 4.?re: 新書推薦:《Power Designer系統分析與建模實戰》
-
您好,今天買了您的這本書,為了更好的學習,麻煩將書中的樣例工程文件發給我,萬分感謝,感謝作者寫出這么好的書,我特別需要,祝大賣~~
yaozhilu@foxmail.com - --智祿
- 5.?re: 新書推薦:《Power Designer系統分析與建模實戰》
-
您好,書不錯,已經買了,麻煩發套樣例工程吧,最好詳細點的,萬分感激!
jackylee365@163.com - --李成龍
閱讀排行榜
- 1.?常用加密算法的Java實現總結(二)——對稱加密算法DES、3DES和AES(143718)
- 2.?用Ant實現Java項目的自動構建和部署(123992)
- 3.?異常備忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file(114282)
- 4.?Java代碼規范、格式化和checkstyle檢查配置文檔(71836)
- 5.?常用加密算法的Java實現總結(一)——單向加密算法MD5和SHA(62394)
- 6.?通用權限管理系統設計篇(三)——概要設計說明書(61754)
- 7.?使用XFire+Spring構建Web Service(一)——helloWorld篇(53673)
- 8.?基于注解的Spring MVC+Hibernate簡單入門(52601)
- 9.?在阿里云Linux服務器上安裝MySQL(49660)
- 10.?關系型數據的分布式處理系統MyCAT(1)—概述和基本使用教程(47778)