pengpenglin
人,必須選擇一種生活方式并有勇氣堅持下去
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 262, comments - 221, trackbacks - 0
設計模式總結-Strategy模式
注:本文參考了《Java設計模式》一書和
WWW.jdon.com
網站的《Strategy模式》一章
一、Strategy模式的意圖:
策略操作定義了策略的輸入和輸出,而把策略的實現工作留給了各個類。這些類以不同的方案來實現同一操作,它們為用戶提供統一的接口,因而這些類可以相互替換。
Strategy模式允許多種策略共存,而代碼不會混亂。策略模式也可以實現模式選擇邏輯和策略本身相分離。
Strategy模式的意圖在于把可選的策略或方案
封裝在不同的類中
,并在這些類中
實現一個共同的操作
。
二、Strategy模式的例子:
·抽象父類:
public
abstract
class
RepTempRule
{
protected
String oldString
=
""
;
public
void
setOldString(String oldString)
{
this
.oldString
=
oldString;
}
protected
String newString
=
""
;
public
String getNewString()
{
return
newString;
}
public
abstract
void
replace()
throws
Exception;
}
·繼承子類:
public
class
RepTempRuleOne
extends
RepTempRule
{
public
void
replace()
throws
Exception
{
//
replaceFirst是jdk1.4新特性
newString
=
oldString.replaceFirst(
"
aaa
"
,
"
bbbb
"
)
System.out.println(
"
this is replace one
"
);
}
}
public
class
RepTempRuleTwo
extends
RepTempRule
{
public
void
replace()
throws
Exception
{
newString
=
oldString.replaceFirst(
"
aaa
"
,
"
ccc
"
)
System.out.println(
"
this is replace Two
"
);
}
}
·幫助類:
public
class
RepTempRuleSolve
{
//
當前的策略
private
RepTempRule strategy;
//
初始化時指定默認的策略
public
RepTempRuleSolve(RepTempRule rule)
{
this
.strategy
=
rule;
}
//
根據當前策略處理用戶的請求
public
String getNewContext(Site site,String oldString)
{
return
strategy.replace(site,oldString);
}
//
動態切換策略
public
void
changeAlgorithm(RepTempRule newAlgorithm)
{
strategy
=
newAlgorithm;
}
}
三、Strategy模式的特點:
·有一個抽象的父類/接口,在其中定義了操作的模板(類似于Template模式)
·有一至多個實現類或子類,實現了父類/接口中的模板方法
·有
一個可供客戶端動態切換算法的幫助類,該類擁有一個策略對象,可以在初始化時指定默認的策略,也可以在運行時通過set方法動態切換策略
四、Strategy模式與其它模式的比較:
·Strage模式與State模式的比較
在對狀態進行建模時,狀態的遷移是一個重要的方面(即如何切換到上、下一個狀態);而在對策略進行建模時,遷移與策略的選擇并不相關
(即關注的是操作的策略,對象狀態的切換并不是關注的方面)。
另外一個不同之處就是,Strategy模式可能允許客戶選擇或者提供一個策略,而State模式卻很少設計這樣的思路。
·Strategy模式與Template模式的比較
Strategy模式的最大特點是可以在運行期間動態地切換算法。這一點和“Template”模式有點不同,后者雖然也提供抽象的模板框架,并且由子類繼承實現,
Template模式一般在確定之后的運行期間就不會再次切換了。而前者可以或者說需要在運行期間動態地切換
五、Strategy模式的適用場合:
1.以不同的格式保存文件;
2.以不同的算法壓縮文件;
3.以不同的算法截獲圖象;
4.以不同的格式輸出同樣數據的圖形,比如曲線 或框圖bar等
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2008-04-08 11:52
Paul Lin
閱讀(5361)
評論(2)
編輯
收藏
所屬分類:
模式與重構
FeedBack:
#
re: 設計模式總結-Strategy模式
2008-04-13 09:23 |
applupus
幫助類的代碼是不是有問題?
return strategy.replace(site,oldString);
策略中的方法是replace(),是不帶參數的。
回復
更多評論
#
re: 設計模式總結-Strategy模式[未登錄]
2012-04-02 13:13 |
vince
這個例子做Strategy不太合適
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
設計模式總結-Visitor模式
設計模式總結-Strategy模式
設計模式總結-State模式
設計模式總結-Command模式
設計模式總結-Memento模式(二)
設計模式總結-Memento模式(一)
設計模式總結-Observer模式
設計模式總結-Flyweight模式
設計模式總結-Bridge模式
設計模式總結-Decorator模式(二)
Copyright ©2025 Paul Lin Powered by:
博客園
模板提供:
滬江博客
<
2012年4月
>
日
一
二
三
四
五
六
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
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(21)
給我留言
查看公開留言
查看私人留言
隨筆分類
J2EE 框架(9)
J2EE基礎(4)
J2SE(43)
Java 工具(5)
Oracle Concept(4)
Oracle SQL/PLSQL(9)
Oracle 開發(13)
Oracle 管理(4)
Oracle 調優
Oracle 錯誤診斷
RoR(19)
UML(3)
Unix / Linux(13)
Web基礎(19)
其它技術(7)
感悟(3)
雜項(7)
架構與性能(8)
模式與重構(19)
灌水(8)
電影與音樂(16)
走過的路(1)
軟件過程與軟件方法(3)
陽光戶外(2)
項目管理(36)
隨筆檔案
2012年2月 (3)
2011年11月 (4)
2011年10月 (1)
2011年9月 (2)
2011年8月 (2)
2011年7月 (5)
2011年6月 (3)
2011年5月 (1)
2011年4月 (1)
2011年3月 (3)
2011年1月 (1)
2010年12月 (1)
2010年11月 (5)
2010年10月 (3)
2010年9月 (1)
2010年7月 (1)
2010年6月 (1)
2010年5月 (4)
2010年4月 (9)
2010年3月 (19)
2010年2月 (8)
2010年1月 (3)
2009年12月 (34)
2009年11月 (1)
2009年10月 (2)
2009年7月 (4)
2009年6月 (5)
2009年5月 (3)
2009年4月 (2)
2009年3月 (1)
2009年2月 (5)
2009年1月 (5)
2008年12月 (13)
2008年11月 (4)
2008年10月 (1)
2008年9月 (6)
2008年8月 (5)
2008年7月 (3)
2008年6月 (31)
2008年5月 (10)
2008年4月 (9)
2008年3月 (7)
2008年2月 (4)
2008年1月 (19)
BlogJava熱點博客
BeanSoft
Jack.Wang
如坐春風
詩特林
鄭暉
銀河使者
阿密果
隔葉黃鶯
好友博客
無羽蒼鷹
搜索
最新評論
1.?re: 【Java基礎專題】編碼與亂碼(01)---編碼基礎[未登錄]
666666666666666666666這幾天正在做個類似工程編碼出現錯誤
--李
2.?re: 【Java基礎專題】IO與文件讀寫---使用Apache commons IO簡化文件讀寫
不錯
--阿斯蘭
3.?re: 【Java基礎專題】編碼與亂碼(03)----String的toCharArray()方法
多謝分享
--thx
4.?re: 【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉換
評論內容較長,點擊標題查看
--karl
5.?re: 【Java基礎專題】編碼與亂碼(01)---編碼基礎[未登錄]
謝謝,幫了我大忙!
--小龍
閱讀排行榜
1.?Oracle中如何插入特殊字符:& 和 ' (多種解決方案)(48447)
2.?getOutputStream() has already been called for this response的解決方法(43351)
3.?【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉換(37032)
4.?360安全衛士誤刪audiosrv.dll文件造成系統無聲的解決方案(21269)
5.?Java中讀取字節流并按指定編碼轉換成字符串的方法(17320)
評論排行榜
1.?360安全衛士誤刪audiosrv.dll文件造成系統無聲的解決方案(33)
2.?【原】Oracle開發專題之:時間運算(11)
3.?【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉換(11)
4.?getOutputStream() has already been called for this response的解決方法(10)
5.?【原】Oracle開發專題之:分析函數(OVER)(8)
主站蜘蛛池模板:
亚洲日韩在线第一页
|
欧洲一级毛片免费
|
免费观看午夜在线欧差毛片
|
亚洲乱码在线卡一卡二卡新区
|
91精品视频在线免费观看
|
亚洲精品高清国产一久久
|
亚洲AV日韩AV永久无码绿巨人
|
视频一区在线免费观看
|
四虎影视永久免费观看
|
国产亚洲一卡2卡3卡4卡新区
|
国产嫩草影院精品免费网址
|
国产精品亚洲综合天堂夜夜
|
亚洲AV无码乱码在线观看性色扶
|
一级视频在线免费观看
|
国产亚洲精品国看不卡
|
日韩免费的视频在线观看香蕉
|
亚洲无删减国产精品一区
|
四虎在线成人免费网站
|
亚洲综合av一区二区三区不卡
|
日韩伦理片电影在线免费观看
|
男人扒开添女人下部免费视频
|
亚洲熟妇丰满多毛XXXX
|
97av免费视频
|
亚洲精华液一二三产区
|
亚洲国产一区二区视频网站
|
日韩免费观看一区
|
久久精品亚洲AV久久久无码
|
在线永久免费观看黄网站
|
最新久久免费视频
|
亚洲免费在线视频播放
|
可以免费观看的一级毛片
|
国产一区二区免费视频
|
亚洲深深色噜噜狠狠网站
|
亚洲电影日韩精品
|
59pao成国产成视频永久免费
|
亚洲成AV人片在线观看
|
国产92成人精品视频免费
|
羞羞漫画小舞被黄漫免费
|
久久久久久a亚洲欧洲AV
|
在线观看视频免费完整版
|
一级特黄录像视频免费
|