JAVA设计模式(16):行为型-策略模式(Strategy)

时间:2015-05-14 23:52:00   收藏:0   阅读:235
场景
某个市场人员接到单后的报价策略(CRM系统中常见问题)报价策略很复杂,可以简单做如下分类:

具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们采用策略模式即可。


我们先采用条件语句处理

public class Test {
	public double getPrice(String type,double price){
		if(type.equals("普通客户小批量")){
			System.out.println("不打折,原价");
			return price;
		}else if(type.equals("普通客户大批量")){
			System.out.println("打九折");
			return price*0.9;
		}else if(type.equals("老客户小批量")){
			System.out.println("打八五折");
			return price*0.85;
		}else if(type.equals("老客户大批量")){
			System.out.println("打八折");
			return price*0.8;
		}
		return price;
	}
}


假如,类型特别多,算法比较复杂时,整个条件控制代码会变的很长,难于维护。

策略模式对应于解决某一个问题的算法族,允许用户从该算法族中任选一个算法解决某一问题,
同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。


优点

缺点


组成


public interface DiscountStratery {
	public double getDiscount(double originPrice);
}

public class VipDicount implements DiscountStratery {

	public double getDiscount(double originPrice) {
		// 重写getDiscount()方法,提供VIP打折算法
		System.out.println("使用VIP折扣.....");
		return originPrice * 0.5;
	}
}

public class OldDicount implements DiscountStratery {

	public double getDiscount(double originPrice) {
		// 重写getDiscount()方法,提供VIP打折算法
		System.out.println("使用旧书折扣.....");
		return originPrice * 0.7;
	}
}

public class DiscountContext {
	// 组合一个DiscountStratery对象
	private DiscountStratery strategy;

	public DiscountContext(DiscountStratery strategy) {
		this.strategy = strategy;
	}

	// 根据实际所使用的DiscountStratery对象得到折扣价
	public double getDiscountPrice(double price) {
		// 如果strategy为 null 系统自动选择OldDicount类
		if (strategy == null) {
			strategy = new OldDicount();
		}
		return this.strategy.getDiscount(price);
	}

	// 提供切换算法的方法
	public void changeDiscount(DiscountStratery strategy) {
		this.strategy = strategy;
	}

}

public class StrategyClient {

	public static void main(String[] args) {
		// 客户端没有选择打折策略类
		DiscountContext dc = new DiscountContext(null);

		double price = 79;
		// 使用默认的打折策略
		System.out.println("79元书的默认打折后的价格是:" + dc.getDiscountPrice(price));

		// 客户端选择合适的VIP打折策略
		dc.changeDiscount(new VipDicount());

		double price2 = 89;
		System.out.println("89元的书对VIP用户的价格是" + dc.getDiscountPrice(price2));

	}

}


本质
分离算法,选择实现。


开发中常见的场景

  1. JAVA中GUI编程中,布局管理
  2. Spring框架中,Resource接口,资源访问策略
  3. java.servlet.http.HttpServlet#service()

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!