JAVA设计模式(16):行为型-策略模式(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()
时间: 2024-12-25 18:19:40

JAVA设计模式(16):行为型-策略模式(Strategy)的相关文章

Java设计模式(七)策略模式 模板模式

(十三)策略模式 策略模式定义了多个封装起来的算法,封装的算法可以相互替换,并且算法的变化不会影响到使用算法的客户.借用另一位大神的例子. interface ICalculator{ public int calculate(String exp); } abstract class AbstractCalculator{ public int[] split(String exp,String opt){ String array[] = exp.split(opt); int arrayI

设计模式(二)策略模式(Strategy)

1.分析项目中变化部分与不变部分 2.多用组合,少用继承:用行为类组合,而不是行为的继承 案例: 第一步,把行为抽象为接口 package top.littlepage.designPattern.Strategy; public interface FlyBehavior { void fly(); } 第二步,把具体行为用实体类实现 package top.littlepage.designPattern.Strategy; public class BadFly implements Fl

[设计模式-行为型]策略模式(Strategy)

一句话 在一个类的对象中维护策略的类的对象. 看起来和状态模式很类似. 概括 解析 STRATEGY-跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦. 策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化.策略模式把行为和环境分开.环境类负责维持和查询行为类,各种算法在具

Java设计模式菜鸟系列(一)策略模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39721563 今天开始咱们来谈谈Java设计模式.这里会结合uml图形来讲解,有对uml建模不熟的可以参考我的另一篇博文uml建模. 首先,个人觉得模式的设计就是一个将变化的东西和不变(稳定)的东西分离的过程.咱们的应用中可能有很多需要改变的地方,而模式要做的就是把它们"抽取"出来并进行"封装"和"实现",因此更多的时候咱们是面向接口编程

设计模式之二:策略模式(Strategy)

策略模式(strategy)定义了一个算法家族,这个算法家族封装了一系列的算法,但是这些算法之间是相互可以替换的.策略模式让算法的变化和它们调用者的变化分离开来了. UML图如下: 主要包括: Strategy:声明了一个对所有算法而言通用的接口类,下面的Contex类使用这个接口来调用一个一个具体的Stragety的算法. ConcreteStrategy:使用Strategy这个接口具体化的算法类 Context:通过一个指向具体的Strategy的指针来操作这个具体的Strategy对象.

java设计模式(六)策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换,让算法独立于使用它的客户而独立变化,具体应用场景如第三方支付对接不同银行的算法. 要点:1)抽象策略角色    2)具体策略角色:包装相关算法和行为 3)环境角色:持有一个策略类的引用,最终给客户端调用 1.抽象策略接口 public interface SwimmingStratege { public void swimming(); } 2.具体策略角色SwimmingWithFoot public class S

Headfirst设计模式的C++实现——策略模式(Strategy)

前言 最近在学习<Headfirst设计模式>,里面的例子都是Java的.但是我对Java并不熟悉,所以试着用C++来实现书中的例子. 先来看看Duck以及子类 Duck.h 1 #include <iostream> 2 #include "FlyBehavior.h" 3 4 class Duck 5 { 6 private: 7 FlyBehavior *m_p_fly_behavior; 8 public: 9 virtual void quack()

Java 设计模式学习笔记1——策略模式(Duck例子)

0.假设现有工程(Duck)中遇到为类添加功能的问题,如何设计类添加新的功能? 1.利用继承提供的Duck(鸭子)的行为会导致哪些缺点? (1)代码在多个子类中重复 (2)很多男知道所有鸭子的全部行为 (3)运行时的行为不容易改变 (4)改变会牵一发动全身,造成其他鸭子的不想要的改变 [设计原则] 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需呀变化的代码混在一起 2.分开变化与不会变化的部分 将Duck分成两部分,鸭子类和鸭子行为. 类的固有属性和共用的方法写在类中,行为另起一个类

设计模式实现C++ --策略模式Strategy(对象行为型)

1.问题 出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机.每个策略都可以得到相同的结果,但是它们使用了不同的资源.选择策略的依据 是费用,时间,使用工具还有每种方式的方便程度. 2.解决方案 策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想. strategy模式类图: 3.应用场景 1. 

设计模式---策略模式Strategy(对象行为型)

1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理. 2. 应用场景 (1)多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为. (2)需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现. (3)对客户隐藏具体策略(算法)的实现细节,彼此完全独立. 3. 示例 出行旅游:我们可以有几个策略可以考虑:可