【设计模式】一文读懂策略模式

前言

学习设计模式不仅仅是炫技,还可以让你 在看各种代码时如鱼得水。碰到一些典型的设计模式,还会惊讶于Coder的设计。

今天来分享设计模式中的策略模式,也是最近在实习中看到的。

其实策略模式在项目中的应用很多,封装不同的算法,然后只需要调用即可,这样即使你不会设置一些算法(策略),但是你可以拿到别人设计好的策略开箱即用。

什么是策略模式?

就像之前说的,策略模式会定义一系列算法,或者叫做策略 - Strategy。每个算法会独立封装在特定的类中,使用哪个策略,直接调用替换即可。注意:替换的过程是在运行中动态完成的,不需要修改客户端代码。

  • 策略模式的组成部分
    • 抽象策略(Strategy):定义了所有策略类必须实现的接口或抽象类。
    • 具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含具体的算法实现。
    • 环境(Context):维护一个对策略对象的引用,并通过该引用调用策略。

一般我们的具体策略可以通过工厂模式来生产:策略对象。我们想要调用什么策略,就从工厂拿哪个策略即可。

谁去调用这个策略呢?可以维护一个Map。key就是我们的触发策略条件,value就是我们具体的策略;

接下来我们来看一个代码具体分析策略模式的作用:

策略模式核心实践

// 抽象策略接口
public interface Strategy {
    public int doOperation(int num1, int num2);
}

// 具体策略类A
public class OperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

// 具体策略类B
public class OperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

// 环境类
public class Context {
    private Strategy strategy;

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

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

// 测试策略模式
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    }
}

我们定义了两个策略,加策略 和 减策略。

Context是我们的环境,环境不知道具体调用了哪个策略,因为环境只配置了抽象策略类的引用。

具体调用哪个策略,由我们来决定,比如前端传入 + ,那么我可以从Map中匹配 + 对应的策略就是OperationAdd,此时我把OperationAdd添加到环境中,直接让环境调用抽象策略类,这样就选择到了我们的具体策略类的重写实现。

这就是策略模式的主要使用方式,

策略模式的优点

  1. 算法切换自由:可以在运行时根据需要切换不同的算法,而无需修改客户端代码。这使得系统更加灵活和可扩展。
  2. 避免多重条件判断:通过将算法封装在独立的策略类中,消除了复杂的条件语句(如 if-else 或 switch-case),使代码更加清晰和易于维护。
  3. 扩展性好:新增算法只需新增一个策略类,无需修改现有代码。这符合开闭原则(Open/Closed Principle),即对扩展开放,对修改关闭。
  4. 提高代码复用性:不同的策略类可以在不同的环境中复用,避免了代码重复。
    • 比如我们很多策略有重复的代码 ,我们就可以把相同的行为抽象成同一个,减少重复代码。
  5. 简化单元测试:每个策略类都可以独立测试,确保每个算法的正确性。同时也做到了业务逻辑与算法分离。

策略模式的缺点

  1. 如果你本来就用不到多少策略,算法不经常改变,这样你就没必要使用策略模式,只会增加代码的复杂度;
  2. 客户端必须知道不同策略的不同 - 我们需要选择合适的策略;

可以参考的文章:https://refactoringguru.cn/design-patterns/strategy

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
责任链设计模式是一种行为型设计模式,用于将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。该模式将这些对象串成链,并沿着这条链传递请求,直到有一个对象能够处理它为止。 责任链模式的核心是定义一个处理请求的抽象类或接口,然后让多个具体的处理者对象继承或实现这个类/接口。每个具体的处理者对象都包含一个对下一个处理者对象的引用,形成一个链式结构。 当一个请求进入责任链时,责任链中的每个处理者都有机会处理该请求。如果可以处理请求,则进行处理;如果不能处理,则将请求传递给下一个处理者,直到有一个处理者能够处理它。 责任链模式的关键点是要找到合适的处理者顺序和条件。通常情况下,责任链模式适用于以下情况: 1. 有多个对象可以处理同一类型的请求,但具体由哪个对象来处理由运行时决定。 2. 不明确请求的接收者,希望请求在一个对象链中流动,直到被处理。 3. 需要动态地指定可以处理请求的对象集合。 使用责任链模式可以实现请求发送者和接收者的解耦,增加代码的灵活性和可扩展性。但同时也需要注意责任链的长度和效率问题,避免责任链过长或造成性能问题。 总结一下,责任链设计模式是一种将请求发送者和接收者解耦的设计模式,通过将多个处理者对象串成链,沿着这条链传递请求,直到有一个处理者能够处理它。这样可以增加代码的灵活性和可扩展性,适用于有多个对象可以处理同一类型请求的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sivan_Xin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值