大话设计模式——18.策略模式(Strategy Pattern)

简介

是一系列算法的封装,即做的事情相同(方法名称相同)但是实现的方式不同,以相同方式调用所有的算法,减少算法与使用算法的耦合。直接调用方法。

UML图

在这里插入图片描述

应用场景
  • Java AWT中的LayoutManager(布局管理器)
  • 系统中存在多个类,它们的区别仅在于它们的行为
  • 不希望暴露复杂与算法有关的数据结构
  • Java中Comparator 接口常用的 compare()方法

示例

电商平台会经常进行商品优惠活动,对商品或订单价格进行改动

  1. 商品
public class Product {

    /**
     * 产品价格
     */
    private double price;

    /**
     * 产品名称
     */
    private String productName;

    public Product(double price, String productName) {
        this.price = price;
        this.productName = productName;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }
}
  1. 策略:活动优惠策略
public interface Strategy {

    /**
     * 计算商品价格
     *
     * @param product
     * @return
     */
    double computePrice(Product product);
}

没有活动:

public class NormalActivity implements Strategy {

    @Override
    public double computePrice(Product product) {
        return product.getPrice();
    }
}

打折活动:

public class DiscountActivity implements Strategy {

    private double discount;

    public DiscountActivity(double discount) {
        this.discount = discount;
    }

    @Override
    public double computePrice(Product product) {
        return product.getPrice() * discount;
    }
}

代金券活动:

public class VoucherActivity implements Strategy {

    /**
     * 代金券
     */
    private double voucher;


    public VoucherActivity(double voucher) {
        this.voucher = voucher;
    }

    @Override
    public double computePrice(Product product) {
        return product.getPrice() > voucher ? product.getPrice() - voucher : 0;
    }
}
  1. 活动上下文:选择适当的活动促销策略
public class PromotionContext {

    /**
     * 策略
     */
    private Strategy strategy;


    public PromotionContext(Strategy strategy) {
        this.strategy = strategy;
    }

    public double executeStrategy(Product product) {
        return this.strategy.computePrice(product);
    }
}
  1. 运行
public class Main {

    public static void main(String[] args) {

        // 创建商品
        Product phone = new Product(1999, "手机");

        // 促销策略
        PromotionContext promotionContext;

        // 原价
        promotionContext = new PromotionContext(new NormalActivity());
        System.out.println("原价:" + promotionContext.executeStrategy(phone));

        // 8折优惠
        promotionContext = new PromotionContext(new DiscountActivity(0.8));
        System.out.println("优惠价格:" + promotionContext.executeStrategy(phone));

        // 2000代金券
        promotionContext = new PromotionContext(new VoucherActivity(2000));
        System.out.println("券后价格:" + promotionContext.executeStrategy(phone));

    }
}

在这里插入图片描述

总结

  • 优点:

    • 满足开闭原则,当增加具体策略时,不需要修改上下文代码
    • 避免使用过多的条件判断,过多的条件判断语句不利于系统可维护性,扩展性和灵活性
  • 缺点

    • 策略类可能过多可能导致膨胀,复用性较小

相关推荐

  1. 大话设计模式策略模式

    2024-04-10 06:04:02       45 阅读
  2. 设计模式(19):策略模式

    2024-04-10 06:04:02       37 阅读
  3. 设计模式14、strategy 策略模式

    2024-04-10 06:04:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 06:04:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 06:04:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 06:04:02       82 阅读
  4. Python语言-面向对象

    2024-04-10 06:04:02       91 阅读

热门阅读

  1. 【开发工具】Vim 编辑器基础指南

    2024-04-10 06:04:02       36 阅读
  2. 前端处理axios请求下载后端返回的文件流

    2024-04-10 06:04:02       35 阅读
  3. Es中bool 查询中的四个(must must_not should filter)

    2024-04-10 06:04:02       35 阅读
  4. 在QT里使用TCP进行网络通信

    2024-04-10 06:04:02       28 阅读
  5. Android 14 vold 分析(1)启动

    2024-04-10 06:04:02       24 阅读
  6. Android 14 vold 分析(2)VolumeManager 和 NetlinkManger

    2024-04-10 06:04:02       27 阅读
  7. MyBatis事务管理

    2024-04-10 06:04:02       32 阅读
  8. 手写一个民用Tomcat (03)

    2024-04-10 06:04:02       30 阅读
  9. Android 14 vold 分析(3)vold和mount service通信

    2024-04-10 06:04:02       28 阅读