理解策略模式

策略模式

策略模式的理解就是当代码里面的某个地方遇到了多种选择,多种方案,多种可能性的时候。最笨的方法就是针对不同的选择 做if-else,然后分别选择各种方案。

java 复制代码
if(A){
方案A
}if else(B){
方案B
}
if else(C){
方案C
}

但是这样代码会非常的臃肿和不好维护,因为所有的方案都写到了一个方法里面。


策略模式就是把这些方案使用独立的类 封装起来,有多少个方案就有多少个类。 所有的方案实现一个统一的接口(方案的总和)。

比如网上常见的经典的 "付款折扣模型"

付款是一个方案的总和,付款下面有各种方案 比如 一折 三折 五折 八折 。。。。

注意策略模式里面这些一个个方案都是独立 互斥的,你只能多选一。

代码示例

先来一个抽象的统一接口 ------付款方式

(这个接口就是宏观上对所有方案的总结)

java 复制代码
public interface Buyer {
    BigDecimal calPrice(BigDecimal orderPrice);
}

然后我们针对每个方案创建一个类 (替换原有的if-else)

(这里也可以发现 如果方案特别特别多的话 策略模式代码还是挺麻烦的)

java 复制代码
public class VIP1 implements Buyer {
    @Override
    public BigDecimal calPrice(BigDecimal orderPrice) {
        一折计算
    }
}
public class VIP2 implements Buyer {
    @Override
    public BigDecimal calPrice(BigDecimal orderPrice) {
       二折计算
    }
}
public class VIP3 implements Buyer {
    @Override
    public BigDecimal calPrice(BigDecimal orderPrice) {
     三折计算
    }
}

接下来主要的一步就是 "判断", 现在已经有了三种 付款方案 实现了抽象 付款接口。

那么客户端调用的时候 怎么样根据客户端的需求 选择对应的方案:

java 复制代码
public class Cashier {
    private Buyer buyer;
    public Cashier(Buyer buyer) {
        this.buyer = buyer;
    }
    public BigDecimal qupta(BigDecimal orderPrice) {
        return this.buyer.calPrice(orderPrice);
    }
}

这里我们创建一个上下文收银类 cashier。

cashier 定义1个属性 Buyer (注意 这里Buyer是一个接口,而不是类。)

在它的构造函数中 对 Buyer 进行赋值,这里利用了java中的多态特性,实现了同一个接口的不同实现。


测试

java 复制代码
        Cashier ex = new Cashier(new VIP1());
        System.out.println(ex.quota(new BigDecimal(100)));

        Cashier svip = new Cashier(new VIP2());
        System.out.println(svip.quota(new BigDecimal(100)));

        Cashier vip = new Cashier(new VIP3());
        System.out.println(vip.quota(new BigDecimal(100)));
相关推荐
赶路人儿4 天前
MacOS 下实现 AI 操控电脑(Computer Use)的思考
人工智能·macos·策略模式
Fozei4 天前
录屏原理与鼠标可视化
计算机外设·策略模式
AIex-YH8 天前
菌种工艺四讲(三):育种工具不是“越新越好“,是“越匹配越好“
制造·策略模式
起司喵喵8 天前
Flutter-MacOS桌面OS系统|flutter.+window_manager客户端OS模板
flutter·macos·策略模式
啊真真真8 天前
macOS下libnfc ..写卡失败问题及解决方案
macos·策略模式
Eric Woo X10 天前
macOS 旧版本无法启动 Steam ?一条命令恢复运行(2026年7月实测)
macos·策略模式
张小姐的猫18 天前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
笨拙的老猴子24 天前
小明学架构师的第七课:策略模式:告别if-else的选择困难症
系统架构·策略模式
肖爱Kun25 天前
C++设计策略模式
开发语言·c++·策略模式
折哥的程序人生 · 物流技术专研1 个月前
Java 23 种设计模式:从踩坑到精通 | 番外:策略 vs 模板方法 —— 组合与继承的终极对决
java·策略模式·java面试·comparator·模版方法模式·java设计模式·从踩坑到精通