1策略模式的定义
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
开闭原则是指一个软件的实体应当对扩展开放,对修改关闭。即我们在设计一个模块时,应当做到这个模块在不被修改的前提下对扩展开放。
根据面向对象设计的“开-闭”原则,当有一组算法对于某些应用是必不可少的,客户可能需要算法的多种不同实现,允许增加新的算法实现或者改变现有的算法实现,在设计时,我们可以把这样的算法封装到单独的类中,称为strategy。策略模式就是从对可变性的东西封装的原则,实现“开闭原则”的模式。
2策略模式的运用
每年在新生入学时,由于本科生、硕士生和博士生,他们助学金额的计算方法不同。一般实现:用分支语句。
public class Test {
public static void main(String[] args) {
if(student is Granduate){
//xxxxxxx
}else if if(student is Master){
//xxxxxxx
} if(student is Doctor){
//xxxxxxx
}
}
}
如果产生以下二个问题:
计算方法发生变化; 增加了助学金计算方法(如增加了博士后的助学金) 就要修改客户端的代码,这显然违背了“开闭原则”。
仔细分析,这个问题的可变性代码就是3个算法,可以考虑先把这3个算法分别用三个类封装起来:
public class GranduateStipend{
public void Payoff(){//本科生计算算法}
}
public class MasterStipend{
public void Payoff(){//硕士生计算算法}
}
public class DoctorStipend{
public void Payoff(){//博士生计算算法}
}
根据面向抽象编程的原则,可以把3个算法抽象成一个接口或者一个抽象类,并使这3个算法类成为它的子类。 实际中客户端是面对接口编程,而真正的算法实现却是由抽象接口的子类完成,做到了可变的算法和客户实现隔离。
参与者
Strategy:定义所有支持的算法的公共接口。
Context:用一个ConcreteStrategy对象来配置。 维护一个对Strategy对象的引用。 可定义一个接口来让Stategy访问它的数据。
ConcreteStrategy: 以Strategy接口实现某具体算法。
协作方法:
Strategy and Context interact to implement the chosen algorithm A context forwards requests from its clients to its strategy
例如:
public class Context {
Strategy stra;
public Context(Strategy stra) {
this.stra = stra;
}
public void doMethod() {
stra.method();
}
}
public class Test {
public static void main(String[] args) {
Context ctx = new Context(new StrategyImplA());
ctx.doMethod();
ctx = new Context(new StrategyImp());
ctx.doMethod();
ctx = new Context(new StrategyImplC()); ctx.doMethod();
}
}
3策略模式的优缺点
优点:
1.策略模式提供管理相关算法族的方法。
2.策略模式提供了可以替代继承的一种方法。
3.可以使程序避免使用多重选择语句。
缺点:
1.策略模式要求客户端必须知道所有的策略类。
2.策略模式产生了很多策略类。
例如策略模式只能处理客户端从几种方式中选择一种的情况,不能解决客户端同时选择一种以上的情况。这时策略模式就要和装饰模式共同应用。
分享到:
相关推荐
设计模式--策略模式java例子
设计模式---策略者模式---根据《Head First 设计模式》自己实现
android应用开发设计模式之-策略模式源代码
设计模式--策略模式StrategyPattern
java设计模式--策略模式 HeadFirst书中的 装饰者模式
北大青鸟关于设计模式的PPT,讲述的非常清晰,对于初学设计模式的人来说,非常有用。本篇是关于策略模式的PPT
c++设计模式-行为型模式-策略模式;qt工程;c++简单源码; 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于...
JAVA设计模式例程-策略模式,在项目中除工厂模式外就数策略模式用得最多了。源程序,可以研究下。不过没有反射,策略模式结合反射的话,基本上就是一个插件架构。可扩展性超强。
设计模式专题之(十六)策略模式---设计模式策略模式示例代码(python--c++)
设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...
设计模式-策略模式-c++版 压缩包中有build好的程序和工程设计到的所有类的源码,还有一个Uml类图
PPT内容包括:内附代码,实例,方便理解。 继承、封装、多态、UML 设计模式02 设计模式03-创建型模式 ...设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。
深入浅出设计模式(C#版)--策略模式--示例代码
JAVA-设计模式-行为型模式-策略模式
策略模式的深刻讲解,大家可以看看,我觉得不错1
设计模式-策略模式源代码 .net,策略模式,模式,设计模式 文件包中有UML策略模式详解图
设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...
我的个人系列设计模式博客配套代码之 策略模式
第 1 章 策略模式【Strategy Pattern】 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题, 嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看...