1.定义
Strategy Pattern:定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。
2.结构图
抽象策略(Strategy)类:声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。
具体策略类(ConcreteStrategy):实现了在抽象策略类中声明的方法,实现具体算法细节。
环境类(Context):持有一个Strategy的引用。它在解决某个问题(即实现某个方法)时可以采用多种策略。
3.代码实现
(1)定义策略接口
public interface ReturnLabelStrategy {
/**
* 是否选择此物流渠道
*/
boolean choose(ReturnLabelPropsContext context);
/**
* 预检查, 如果失败抛出异常, 不再执行 getReturnLabel 方法
*/
void preCheck(ReturnLabelPropsContext context);
/**
* 生成 returnlabel
*/
void strategyInterface();
}
(2) 定义具体的实现策略
public class ConcreteStrategyA implements ReturnLabelStrategy {
@Override
public void strategyInterface() {
//相关的业务
}
}
(3) 定义环境类
在环境类持有Strategy的引用,或者是引用列表,根据相关条件选择具体的策略实现。
4.使用场景
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
思考以下场景实现: 1.假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。
2、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 3、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 4、JAVA AWT 中的 LayoutManager。
5.总结
策略模式的重点在于如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
策略算法是相同行为的不同实现。
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。