目录
策略模式很类似现在多功能的洗衣机,每次在洗衣服之前,都需要由用户自己选择想要的洗衣策略,洗衣机收到指定的洗衣策略后,组合成一份新的算法和数据结构才去执行。
Strategy Pattern and State Pattern
策略模式和状态模式的区别在于使用者对它们的目的。
策略模式主要用于实现算法的选择和动态切换,强调的是不同策略的独立性和替换性。
状态模式主要用于根据对象的内部状态来改变对象的行为,强调的是对象状态的变化和相应行为的变化。
但其实,你把这个状态
想成策略
,策略替换成状态,也没啥区别。
Strategy Pattern and Polymorphism
策略模式
和多态
在使用场景上,还是很类似的。
但总体来说,策略模式更像多态的升级版本,策略模式更灵活,它依靠接口,而不是继承,所以有更多操作空间。
如果设计的程序比较小,不是那么复杂,使用多态就行,如果稍微大型(复杂)一点,考虑用策略模式。
What is Strategy Pattern and State Pattern
将类的行为和状态绑定在一起,不同的状态对应不同的行为。
将类的行为和策略绑定在一起,不同的策略对应不同的行为。
Key Elements
- 环境(Context):维护一个当前状态对象的引用,负责将请求委派给当前状态对象来处理。
- 抽象状态(State):定义了一个接口,用于封装与环境对象的特定状态相关的行为。
- 具体状态(Concrete State):实现了抽象状态接口,定义了该状态下具体的行为。
- Client
Strategy Pattern VS State Pattern
我在网上找了两个模式的简单示例代码,经过对比分析,唯一的不同就是状态和策略这两个类的名字不一样,其他都是
1.
2.
3.
Strategy Pattern example - Computer and USB interface
现代人对计算机、USB接口还有各种设备之间的关系都很熟悉,而这些由模块组成的系统正是策略模式
的最好范例。
- 定义策略的接口
public interface USB {
public void read();
}
- 接口实现 —— 每个接口实现类就是单个策略
为了保持简单,我们只为USB接口定义一个读取数据方法read(),
接下来就是各种USB设备实现类了,其中键盘、鼠标分别定义各自的实现类。
public class KeyBoard implements USB{
@Override
public void read() {
System.out.println("读取键盘数据...");
}
}
public class Mouse implements USB{
@Override
public void read() {
System.out.println("读取鼠标数据...");
}
}
- 计算机主类
所有USB设备类都实现了USB接口的读取数据方法read(),如键盘设备捕获的是键盘指令数据,鼠标设备捕获的是坐标与点击指令数据。最后,我们需要将它们与计算机主机进行接驳起来。
public class Computer {
private USB usb;
public void setUSB(USB usb){
this.usb = usb;
}
public void execute(){
usb.read();
}
}
- use
接驳起来之后,只需要根据场景设置好USB设备对象,调用电脑的.do方法即可。
public static void main(String[] args) {
Computer computer = new Computer();
computer.setUSB(new KeyBoard());
computer.execute();
computer.setUSB(new Mouse());
computer.execute();
}
Input:
读取键盘数据...
读取鼠标数据...
Example —— 扫描器基于自定义配置切换不同扫描策略
todo
Usage Scenarios
先来看看阿里的开发手册
Reference
Java Polymorphism Concept
https://www.cnblogs.com/mysticbinary/p/17645988.html
Java开发手册(嵩山版).pdf
https://www.haicheng.website/download/book/Java开发手册(嵩山版).pdf