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
阅读(5346)
评论(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新闻
知识库
C++博客
博问
管理
相关文章:
设计模式总结-Visitor模式
设计模式总结-Strategy模式
设计模式总结-State模式
设计模式总结-Command模式
设计模式总结-Memento模式(二)
设计模式总结-Memento模式(一)
设计模式总结-Observer模式
设计模式总结-Flyweight模式
设计模式总结-Bridge模式
设计模式总结-Decorator模式(二)
<
2008年4月
>
日
一
二
三
四
五
六
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
6
7
8
9
10
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(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中如何插入特殊字符:& 和 ' (多种解决方案)(48351)
2. getOutputStream() has already been called for this response的解决方法(43322)
3. 【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换(36952)
4. 360安全卫士误删audiosrv.dll文件造成系统无声的解决方案(21210)
5. Java中读取字节流并按指定编码转换成字符串的方法(17300)
评论排行榜
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)