策略模式,顾名思义,是使用不同的策略解决问题的模式,孙悟空有七十二变,孙子兵法有三十六计,这里的七十二变和三十六计里的每一个变法和计谋,都是一种策略。需要当事者根据具体的情形,去做选择变成什么和使用哪一个计谋。
1. 策略模式类图
2. 策略模式的组成:
抽象策略基类、策略实现类、调用者。
基类中有抽象的算法,实现类实现具体和算法行为,调用者类持有策略接口的引用,可以灵活调用不同实现类的策略。
3. design example
以外出旅行为例,有各种不同的旅行方式。
策略抽象基类
/** * 策略抽象基类, 具有抽象行为接口 */ public interface TravelStrategy { public void travel(); }
实现类:骑行旅行
public class BikeTravel implements TravelStrategy { @Override public void travel() { System.out.println("Travel by Bike."); } }
实现二:火车旅行
public class RailWayTravel implements TravelStrategy { @Override public void travel() { System.out.println("Travel by RailWay."); } }
实现三:徒步旅行
public class WalkTravel implements TravelStrategy { @Override public void travel() { System.out.println("Travel by Walk."); } }
调用者类:旅客
/** * 策略调用类, 持有策略的引用 */ public class Person { private Long id; private String name; private TravelStrategy strategy; public void setStrategy(TravelStrategy strategy) { this.strategy = strategy; } public void travel() { strategy.travel(); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
测试类:
public class InvokeClient { public static void main(String[] args) { Person person = new Person(); person.setStrategy(new WalkTravel()); person.travel(); person.setStrategy(new BikeTravel()); person.travel(); person.setStrategy(new RailWayTravel()); person.travel(); } }
使用策略模式,可以更好地根据不同的情况,做出更适合的应对策略。
优点:
封装算法,降低了算法的使用者和算法之间的耦合度,做好了良好的解耦。
体现了对扩展开放,对修改关闭的设计原则,使程序有更好的可维护性和扩展性。
面向抽象编程,而不是面向具体编程,使系统具有了灵活性。
缺点:
调用者需要知道每一种策略,才能正确地使用策略,要求调用者需要掌握每一种策略的使用场景。
对每一种变化都做了封装策略类,使系统中的类的数量增加,增加了系统的复杂度。
使用场景:
1.替代诸多if..else..条件判断。
2.算法需要自由切换。
3.多个类只在某些行为或算法上有所不同。
使用对象:
可以是一个对象使用多种策略,也可以是不同的对象使用不同的策略,依情形而定。
注意事项:
当策略过多时,会增加系统的复杂度,需要考虑策略膨胀的问题。
相关推荐
设计模式--策略模式java例子
设计模式---策略者模式---根据《Head First 设计模式》自己实现
android应用开发设计模式之-策略模式源代码
设计模式--策略模式StrategyPattern
java设计模式--策略模式 HeadFirst书中的 装饰者模式
北大青鸟关于设计模式的PPT,讲述的非常清晰,对于初学设计模式的人来说,非常有用。本篇是关于策略模式的PPT
c++设计模式-行为型模式-策略模式;qt工程;c++简单源码; 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于...
JAVA设计模式例程-策略模式,在项目中除工厂模式外就数策略模式用得最多了。源程序,可以研究下。不过没有反射,策略模式结合反射的话,基本上就是一个插件架构。可扩展性超强。
设计模式专题之(十六)策略模式---设计模式策略模式示例代码(python--c++)
设计模式-策略模式-c++版 压缩包中有build好的程序和工程设计到的所有类的源码,还有一个Uml类图
设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...
深入浅出设计模式(C#版)--策略模式--示例代码
PPT内容包括:内附代码,实例,方便理解。 继承、封装、多态、UML 设计模式02 设计模式03-创建型模式 ...设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。
JAVA-设计模式-行为型模式-策略模式
策略模式的深刻讲解,大家可以看看,我觉得不错1
设计模式-策略模式源代码 .net,策略模式,模式,设计模式 文件包中有UML策略模式详解图
设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...
第 1 章 策略模式【Strategy Pattern】 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题, 嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看...
我的个人系列设计模式博客配套代码之 策略模式