java23种设计模式—策略模式

策略模式是一种行为型设计模式,维基百科解释如下

行为型设计模式:行为型设计模式是设计模式都一种,用来识别对象之间的常用交流模式并加以实现。如此可在进行这些交流活动时增强弹性。

由此可以看出,行为型设计模式关注的是对象之间的通讯行为。

  • 定义

策略模式:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法都变化独立于使用算法都客户。

  • 角色分类 1.抽象策略接口 2.具体策略类 3.环境类

  • UML图:

image

常点外卖的大概都知道,美团或者饿了么支付时会有一项延迟险可选。美团是迟到十分钟只用支付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
    }
}

策略模式的定义中强调了该模式中,算法的变化独立于算法的使用者。用该示例来说就是,假如美团延迟险赔偿比例发生了变化,那么具体的策略类的实现必然会变,而算法的使用者(示例中的客户端)并不知晓这一变化。

更多设计模式原创文章:

原型模式

单例模式

建造者模式

工厂模式

策略模式




猜你喜欢

转载自blog.csdn.net/m0_37577221/article/details/81047256