设计模式(19):策略模式

策略模式

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

本质

  • 分离算法,选择实现;

策略模式角色

  • 上下文类(Context): 维护了一个策略类的引用,并将客户端的请求委托给具体策略类处理;
  • 抽象策略类(Strategy): 定义了具体的算法方法;
  • 具体策略类(ConcreteStrategy): 对抽象策略类的算法具体实现;

开发中常见的场景

  • spring框架中,Resource接口,资源访问策略;
  • springmvc框架中,controller方法入参解析
  • shiro框架中,权限的认证策略;

场景

  • 某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略很复杂,可以简单作如下分类:
    • 普通客户小批量报价
    • 普通客户大批量报价
    • 老客户小排量报价
    • 老客户大批量报价
  • 具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们采用策略模式即可。

代码实现

  • 抽象策略类(Strategy)
java 复制代码
/**
 * 抽象算法 接口
 */
public interface  Strategy {
	double getPrice(double standardPrice);
}
  • 具体策略类(ConcreteStrategy)
java 复制代码
/**
 * 新客户小批量
 */
public class NewCustomerFewStrategy implements Strategy{
	@Override
	public double getPrice(double standardPrice) {
		System.out.println("不好意思,不打折,原件");
		return standardPrice;
	}	
}
/**
 * 新客户大批量
 */
public class newCustomermanyStrategy implements Strategy{
	@Override
	public double getPrice(double standardPrice) {
		System.out.println("九折");
		return standardPrice*0.9;
	}	
}
/**
 * 老客户小批量
 */
public class OldCustomerFewStrategy implements Strategy{
	@Override
	public double getPrice(double standardPrice) {
		System.out.println("八五折");
		return standardPrice*0.85;
	}	
}
/**
 * 老客户大批量
 */
public class OldCustomermanyStrategy implements Strategy{
	@Override
	public double getPrice(double standardPrice) {
		System.out.println("七折");		
		return standardPrice*0.7;	}	
}
  • 上下文类(Context)
java 复制代码
/**
 * 负责和具体的策略类交互
 * 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化
 */
public class Context {
	private Strategy strategy;
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	public void setStrategy(Strategy strategy) {
		this.strategy = strategy;
	}
	public void PrintPrice(double s){
		System.out.println("你该报价:"+strategy.getPrice(s));
	}	
}
  • 客户端调用
java 复制代码
public static void main(String[] args) {
	Strategy st=new OldCustomermanyStrategy();
	Context ct=new Context(st);
	ct.PrintPrice(999);
}

更多设计模式学习:

设计模式(1):介绍

设计模式(2):单例模式

设计模式(3):工厂模式

设计模式(4):建造者模式

设计模式(5):原型模式

设计模式(6):桥接模式

设计模式(7):装饰器模式

设计模式(8):组合模式

设计模式(9):外观模式

设计模式(10):享元模式

设计模式(11):适配器模式

设计模式(12):代理模式

设计模式(13):模板方法模式

设计模式(14):命令模式

设计模式(15):迭代器模式

设计模式(16):观察者模式

设计模式(17):中介者模式

设计模式(18):状态模式

设计模式持续更新中...

相关推荐
Aniugel1 小时前
JavaScript高级面试题
javascript·设计模式·面试
不当菜虚困2 小时前
JAVA设计模式——(四)门面模式
java·开发语言·设计模式
Niuguangshuo2 小时前
Python设计模式:MVC模式
python·设计模式·mvc
Lei活在当下2 小时前
【现代 Android APP 架构】01. APP 架构综述
android·设计模式·架构
前端大白话2 小时前
震惊!90%前端工程师都踩过的坑!computed属性vs methods到底该怎么选?一文揭秘高效开发密码
前端·vue.js·设计模式
前端大白话2 小时前
前端必看!figure标签在响应式图片排版中的王炸操作,grid/flex布局实战指南
前端·设计模式·html
ApeAssistant3 小时前
Spring + 设计模式 (十四) 行为型 - 观察者模式
spring·设计模式
ApeAssistant3 小时前
Spring + 设计模式 (十三) 行为型 - 策略模式
spring·设计模式
摘星编程4 小时前
并发设计模式实战系列(7):Thread Local Storage (TLS)
设计模式·并发编程
沐土Arvin4 小时前
理解npm的工作原理:优化你的项目依赖管理流程
开发语言·前端·javascript·设计模式·npm·node.js