14_策略模式
2021-01-17 本文已影响0人
真是个点子王
- 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
- 策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
- 策略模式里面有许多函数式编程的思想。
结构
- 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
实例
// Strategy.java
public interface Strategy {
public void show();
}
// StrategyA.java
public class StrategyA implements Strategy{
@Override
public void show() {
System.out.println("买一送一");
}
}
// SalesMan.java
public class SalesMan {
// 聚合策略类对象
private Strategy strategy;
public SalesMan(Strategy strategy) {
this.strategy = strategy;
}
// 由促销员展示促销活动给普通用户
public void salesManShow(){
strategy.show();
}
}
// Client.java
public class Client {
public static void main(String[] args) {
SalesMan salesMan = new SalesMan(new StrategyA());
salesMan.salesManShow();
SalesMan salesMan1 = new SalesMan(new Strategy() {
@Override
public void show() {
System.out.println("明天不要钱");
}
});
salesMan1.salesManShow();
}
}
/*
Output:
买一送一
明天不要钱
*/
分析
- 策略模式是函数式编程的一种体现。
- 在Java的编码中,策略模式其实是很容易碰见的。比如在
sort()
中想要定制比较器规则所使用的Comparator接口或者Comparable接口都策略模式的体现; - 另外在并发编程中,通过实现Runnable接口中的
run()
方法,从而实现线程的业务逻辑的方法也属于策略模式。