标签:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式就要应对规则变化和新规则加入对程序带来的影响。
通过接口可以避免直接调用规则,从而使得业务变化不会对规则产生影响,同时,添加新规则也不会影响业务流程。
策略模式通常包含下面三种角色:
持有一个策略类的引用,需要使用ConcreteStrategy提供的算法,负责动态设置运行时Strategy具体的实现算法
策略类,通常由一个接口或者抽象类实现,定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
包装了相关算法和行为,实现了Strategy定义的接口,提供具体的算法实现。
示例代码
环境角色类
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() { //相关的业务A } }
public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { // 相关的业务B } }
假设现在要设计一个购物车系统。该网站对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。
根据描述,折扣是根据以下的几个算法中的一个进行的:
算法一:对初级会员没有折扣。
算法二:对中级会员提供10%的促销折扣。
算法三:对高级会员提供20%的促销折扣。
1、折扣类(抽象策略角色)
public interface DiscountStrategy { /** * 计算图书的价格 * @param booksPrice 图书的原价 * @return 计算出打折后的价格 */ public double calcPrice(double booksPrice); }
2、价格类(Context环境角色类)
public class Price { // 持有一个具体的策略对象 private DiscountStrategy strategy; /** * @param strategy 具体的策略对象 */ public Price(DiscountStrategy strategy) { this.strategy = strategy; } /** * 计算图书的价格 * * @param booksPrice 图书的原价 * @return 计算出打折后的价格 */ public double quote(double booksPrice) { return this.strategy.calcPrice(booksPrice); } }
3、具体策略角色
/** * 初级会员折扣 */ public class PrimaryMemberStrategy implements DiscountStrategy { @Override public double calcPrice(double booksPrice) { System.out.println("对于初级会员的没有折扣"); return booksPrice; } }
/* * 中级会员折扣 */ public class IntermediateMemberStrategy implements DiscountStrategy { @Override public double calcPrice(double booksPrice) { System.out.println("对于中级会员的折扣为10%"); return booksPrice * 0.9; } }
/* * 高级会员折扣 */ public class AdvancedMemberStrategy implements DiscountStrategy { @Override public double calcPrice(double booksPrice) { System.out.println("对于高级会员的折扣为20%"); return booksPrice * 0.8; } }
4、测试
public class Test { public static void main(String[] args) { // 选择并创建需要使用的策略对象 DiscountStrategy strategy = new AdvancedMemberStrategy(); // 创建环境 Price price = new Price(strategy); // 计算价格 double quote = price.quote(100); System.out.println("图书的最终价格为:" + quote); } }
运行截图:
2、http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
标签:
原文地址:http://www.cnblogs.com/xujian2014/p/5635786.html