java策略模式
2015-07-04 18:10
417 查看
策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减、修改都不会影响到环境和客户端。
策略模式涉及到三个角色:
环境(Context) 角色:持有一个Strategy引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个抽象接口或抽象类实现。此角色给出的所有具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
先来看下测试模式的代码基本结构
环境角色类:
抽象策略类:
具体策略类:
使用场景
假设现在要设计一个贩卖各类书籍单电子商务网站的购物车系统。一个最简单的情况就是把所有的货品单价乘以数量,但实际情况肯定比这复杂。如:本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。
根据描述,有如下的几个算法:
1.对初级会员没有折扣。
2.对中级会员提供10%的促销折扣。
3.对高级会员提供20%的促销折扣。
代码如下:
抽象折扣类
初级会员折扣类
中级会员折扣类
高级会员折扣类
价格类
客户端
策略模式的重心
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
策略模式的优点
1、策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
2、使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
2、由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
策略模式涉及到三个角色:
环境(Context) 角色:持有一个Strategy引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个抽象接口或抽象类实现。此角色给出的所有具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
先来看下测试模式的代码基本结构
环境角色类:
public class Context { //持有一个具体策略的对象 private Strategy strategy; /** * 构造函数,传入一个具体的策略对象 * @param strategy 具体的策略对象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }
抽象策略类:
public interface Strategy { /** * 策略方法 */ public void strategyInterface(); }
具体策略类:
public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { System.out.println("策略A的业务"); } }
public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { System.out.println("策略B的相关业务"); } }
使用场景
假设现在要设计一个贩卖各类书籍单电子商务网站的购物车系统。一个最简单的情况就是把所有的货品单价乘以数量,但实际情况肯定比这复杂。如:本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。
根据描述,有如下的几个算法:
1.对初级会员没有折扣。
2.对中级会员提供10%的促销折扣。
3.对高级会员提供20%的促销折扣。
代码如下:
抽象折扣类
public interface MemberStrategy { /** * 计算图书价格 * @param booksPrice 图书的原价 * @return 计算出打折后的价格 */ public double calcPrice(double booksPrice); }
初级会员折扣类
public class PrimaryMemberStrategy implements MemberStrategy { @Override public double calcPrice(double booksPrice) { System.out.println("对于初级会员没有折扣"); return booksPrice; } }
中级会员折扣类
public class IntermediateMemberStrategy implements MemberStrategy{ @Override public double calcPrice(double booksPrice) { System.out.println("对于中级会员的折扣为10%"); return booksPrice*0.9; } }
高级会员折扣类
public class AdvancedMemberStrategy implements MemberStrategy { @Override public double calcPrice(double booksPrice) { System.out.println("对于高级会员的折扣为20%"); return booksPrice*0.8; } }
价格类
public class Price { //持有一个具体的策略对象 private MemberStrategy strategy; /** * 构造函数,传入一个具体的策略对象 * @param strategy 具体的策略对象 */ public Price(MemberStrategy strategy) { this.strategy = strategy; } /** * 计算图书价格 * @param booksPrice 图书的原价 * @return 打折后的价格 */ public double quote(double booksPrice){ return this.strategy.calcPrice(booksPrice); } }
客户端
public class Client { public static void main(String[] args) { //选择并创建需要使用的策略对象 MemberStrategy strategy = new AdvancedMemberStrategy(); //创建环境 Price price = new Price(strategy); //计算价格 double quote = price.quote(300); System.out.println("图书的最终价格为:"+quote); } }
策略模式的重心
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
策略模式的优点
1、策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
2、使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
2、由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
相关文章推荐
- Java设计模式之策略模式
- Head First 设计模式(一)策略模式
- Java设计模式——策略模式
- 23种设计模式 第三部分 关系模式(1)策略模式
- 《策略模式》
- 策略模式
- java 保留2位小数
- Java命名规则
- Java String,Unicode,byte[],16进制的字符串互转
- 数组中的逆序对 (java实现)
- java web之Filter详解
- 音乐播放器之myeclipse项目
- Spring MVC讲解
- Java之单例模式
- Think In java 笔记一
- 叫号系统排队系统挂号系统实现
- [JavaEE] JBoss主要版本下载链接一览
- 开始玩hadoop7--hadoop 2.6.0 在eclipse里安装(第一个map程序)
- Spring 系列: Spring 框架简介
- Eclipse Push出现rejected - non-fast-forward错误