Java23种设计模式-行为型模式之策略模式

策略模式(Strategy Pattern):将算法的使用从算法的实现中分离出来,从而让算法的变化不会影响到使用算法的用户

通常涉及三个角色

1.上下文(Context):持有策略接口的引用,并在运行时根据需要更换具体的策略实现

2.策略接口(Strategy):定义了所有可能的算法实现应该遵循的协议

3.具体策略实现(Concrete Strategy):实现则实现了这些协议,并为特定的算法提供具体的实现

优点

1.算法的变化不会影响到客户端。

2.可以轻松地切换不同的算法。

3.可以动态地选择不同的算法。

缺点

1.客户端必须知道所有的策略类,至少是它们的接口。

2.可能会增加系统中的类的数量。

应用场景

当一个系统需要多种算法变体时。

当这些算法相互之间是等价的,且可以互换时。

当算法可能发生变化,且变化不应影响到使用算法的客户端时。

示例:FlyStrategy 是策略接口,FlyWithWings 和 FlyNoWay 是具体策略类,Duck 是上下文类,客户端通过创建不同策略的 Duck 对象来模拟不同鸭子的飞行行为

java 复制代码
//策略接口
public interface FlyStrategy {
    void fly();
}
//具体策略类
public class FlyWithWings implements FlyStrategy{
    @Override
    public void fly() {
        System.out.println("The duck is flying with its wings.");
    }
}
// 具体策略类
public class FlyNoWay implements FlyStrategy{
    @Override
    public void fly() {
        System.out.println("The duck cannot fly");
    }
}
//上下文
public class Duck {
    private FlyStrategy flyStrategy;

    public Duck(FlyStrategy flyStrategy) {
        this.flyStrategy = flyStrategy;
    }

    public void performFly(){
        flyStrategy.fly();
    }
}
//客户端
public class Client {
    public static void main(String[] args) {
        Duck mallardDuck=new Duck(new FlyWithWings());
        mallardDuck.performFly();

        Duck rubberDuck=new Duck(new FlyNoWay());
        rubberDuck.performFly();
    }
}
相关推荐
J_liaty6 分钟前
23种设计模式一中介者模式
设计模式·中介者模式
郝学胜-神的一滴12 小时前
在Vibe Coding时代,学习设计模式与软件架构
人工智能·学习·设计模式·架构·软件工程
九狼13 小时前
Flutter SSE 流式响用 Dio 实现 OpenAI 兼容接口的逐 Token 输出
http·设计模式·api
郝学胜-神的一滴14 小时前
单例模式:从经典实现到Vibe Coding时代的思考
开发语言·c++·程序人生·单例模式·设计模式·多线程
J_liaty1 天前
Java设计模式全解析:23种模式的理论与实践指南
java·设计模式
资深web全栈开发1 天前
设计模式之观察者模式 (Observer Pattern)
观察者模式·设计模式
逆境不可逃1 天前
【从零入门23种设计模式03】创建型之建造者模式(简易版与导演版)
java·后端·学习·设计模式·职场和发展·建造者模式
趣魂1 天前
心跳信令通常不采用NACK机制
设计模式·软件工程·软件构建
逆境不可逃1 天前
【从零入门23种设计模式01】创建型之工厂模式(简单工厂+工厂方法+抽象工厂)
java·spring·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式·工厂模式
测试工坊2 天前
内存泄漏自动检测(下):对症下药,5 种泄漏 5 种抓法
设计模式