设计模式-策略模式

发布时间:2024年01月22日

策略模式:

? ? ? ?策略模式(Strategy Pattern)是属于行为型的设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用它的客户端代码,使得算法的修改和扩展变得更加容易。

角色与结构:

1 Context(上下文)

  • 上下文是使用算法的角色,它通常包含一个对 Strategy 对象的引用。
  • 定义了和 Strategy 相关的操作接口,并通过调用 Strategy 的方法来执行具体的策略。

2 Strategy(抽象策略)

  • 定义所有支持的算法的公共接口,为 Context 提供操作算法的方法。
  • 具体策略类需要实现这个接口。

3 ConcreteStrategy(具体策略)

  • 实现了 Strategy 接口,提供了一个具体的算法实现。

?

工作原理:

  • 客户端创建并配置 Context,设置其中所使用的 ConcreteStrategy。
  • 当客户端需要执行某种策略时,只需调用 Context 中的方法,该方法会委托给当前配置的 ConcreteStrategy 来执行具体算法。

?

示例代码:

策略模式java代码

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

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

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

// 上下文类
class Context {
    private Strategy strategy;

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

    public void executeStrategy(int num1, int num2) {
        System.out.println(strategy.doOperation(num1, num2));
    }
    
    // 可以动态改变策略
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd()); // 使用加法策略
        context.executeStrategy(5, 7); // 输出 12

        context.setStrategy(new OperationSubtract()); // 改用减法策略
        context.executeStrategy(10, 3); // 输出 7
    }
}

?说明:在上面代码中Context?类持有?Strategy?对象并在需要执行策略时调用其?doOperation()?方法。我们可以轻松地在运行时切换不同的?ConcreteStrategy,从而执行不同的运算策略。

优点:

  • 可扩展性:可以通过增加新的 ConcreteStrategy 类轻松地添加新策略,而无需修改 Context 或已有的策略类。
  • 解耦:策略模式使得算法的使用与其实际实现分离,使得系统更加灵活和易于维护。
  • 便于复用:各个策略可以在不同的地方被复用,同时策略之间也可以互相组合或切换。

应用场景:

  • 处理大量具有相同目的但处理方式不同的业务场景,例如排序算法、支付策略等。
  • 游戏中的角色技能系统,每个技能是一个策略,角色可以根据战斗情况选择不同的技能策略。
  • 日志记录系统,根据日志级别采用不同级别的日志记录策略。

?

文章来源:https://blog.csdn.net/qyhua/article/details/135731449
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。