策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们需要创建表示各种策略的对象和一个行为随着策略改变而改变的context对象,通过策略对象改变context对象的执行算法。
学习设计模式最重要的一点就是要搞清楚设计模式的应用场景,首先举几个例子,比如我们手机支付的时候,可以使用支付宝可以使用微信也可以使用云闪付,这些支付方式每一种都是一个策略对象,每一种策略都是可以互相替换的;再比如淘宝双十一的打折活动,可以叠津贴、用红包或者店家直接打折,每一种优惠方式也是一种策略。
策略模式做到的就是 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
实现
首先我们画出该模式的UML类图:
其中,Context是上下文对象,是真正执行策略的对象,维护一个实现Strategy接口的类,Strategy接口是策略接口,是用于声明所有算法的接口,SpecificStrategy是Strategy接口的实现类,里面有算法的具体实现。
Context.java
/**
* @author liuergo
* @description Context上下文对象
* @date 2019-11-20 16:16
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
/**
* 执行策略的具体方法
*/
public void executeStrategy() {
strategy.algorithmStatement();
}
}
Strategy.java
/**
* @author liuergo
* @description 策略接口
* @date 2019-11-20 16:09
*/
public interface Strategy {
/**
* 某种算法的声明
*/
public void algorithmStatement();
}
在这里,有两个类实现了Strategy接口。
SpecificStrategyA.java
/**
* @author liuergo
* @description 具体的策略对象
* @date 2019-11-20 16:13
*/
public class SpecificStrategyA implements Strategy{
@Override
public void algorithmStatement() {
System.out.println("算法A");
}
}
SpecificStrategyB.java
/**
* @author liuergo
* @description 具体的策略对象
* @date 2019-11-20 16:15
*/