策略模式是一种行为型设计模式,维基百科解释如下
行为型设计模式:行为型设计模式是设计模式都一种,用来识别对象之间的常用交流模式并加以实现。如此可在进行这些交流活动时增强弹性。
由此可以看出,行为型设计模式关注的是对象之间的通讯行为。
- 定义
策略模式:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法都变化独立于使用算法都客户。
角色分类 1.抽象策略接口 2.具体策略类 3.环境类
UML图:
常点外卖的大概都知道,美团或者饿了么支付时会有一项延迟险可选。美团是迟到十分钟只用支付90%的费用,迟到三十分钟只用支付70%。迟到十分钟之内是可以容忍的,毕竟外卖小哥也十分不容易。无论刮风下雨都要完成客户的吃饭需求。我们以延迟险为例构建示例代码。
- 示例代码
首先是抽象延迟险策略类,方法computePrice会根据不同的策略类的实现计算出客户实际上需要支付的价格。
/**
* Created by tiantian on 2018/7/14.
*/
public interface OverdueInsurenceStrategy {
double computePrice(double price);
}
三个具体的实现类分别为正常到达,迟到十分钟和迟到三十分钟。 正常到达输出原价。
/**
* Created by tiantian on 2018/7/14.
*/
public class NormalStrategy implements OverdueInsurenceStrategy {
@Override
public double computePrice(double price) {
return price;
}
}
迟到十分钟会有0.9的折扣。
/**
* Created by tiantian on 2018/7/14.
*/
public class TenMinuteLateStrategy implements OverdueInsurenceStrategy {
@Override
public double computePrice(double price) {
return price * 0.9;
}
}
迟到三十分钟0.7的折扣。
/**
* Created by tiantian on 2018/7/14.
*/
public class ThirtyMinutesStrategy implements OverdueInsurenceStrategy {
@Override
public double computePrice(double price) {
return price * 0.7;
}
}
支付环境拥有一个OverdueInsurenceStrategy类型对象,并且会根据具体的策略对象计算出该订单实际的费用。
/**
* Created by tiantian on 2018/7/14.
*/
public class PayContext {
OverdueInsurenceStrategy strategy;
PayContext(OverdueInsurenceStrategy strategy) {
this.strategy = strategy;
}
public void pay(double price) {
System.out.println(strategy.computePrice(price) + " RMB");
}
}
客户端测试类如下。假设下雨天,外卖小哥迟到了十分钟。那么客户端采用的具体策略为TenMinuteLateStrategy。
/**
* Created by tiantian on 2018/7/14.
*/
public class Client {
public static void main(String[] args) {
OverdueInsurenceStrategy tenMinStrategy = new TenMinuteLateStrategy();
PayContext context = new PayContext(tenMinStrategy);
context.pay(22.9); // output : 20.61 RMB
}
}
策略模式的定义中强调了该模式中,算法的变化独立于算法的使用者。用该示例来说就是,假如美团延迟险赔偿比例发生了变化,那么具体的策略类的实现必然会变,而算法的使用者(示例中的客户端)并不知晓这一变化。
更多设计模式原创文章: