码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-14 23:52:00      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:java   设计模式   策略模式   strategy   

场景
某个市场人员接到单后的报价策略(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;
	}
}


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

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


优点

  • 可以动态的改变对象的行为
缺点
  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
  • 策略模式将造成产生很多策略类


组成

  • 环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
  • 抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
  • 具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。

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()

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

标签:java   设计模式   策略模式   strategy   

原文地址:http://blog.csdn.net/lovesomnus/article/details/45727479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!