设计模式(018)行为型之策略模式

        策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装成一个对象,并使它们可以互换。策略模式使得算法的变化可以独立于使用算法的客户端。在策略模式中,有三个核心角色:策略接口(Strategy)、具体策略(ConcreteStrategy)、以及上下文(Context)。
① 策略接口(Strategy):定义了一个算法族的接口。
② 具体策略(ConcreteStrategy):实现了策略接口,封装了具体的算法实现。
③ 上下文(Context):维护一个对策略对象的引用,负责将客户端请求委托给具体的策略对象。
策略模式的核心思想是将算法的定义与使用分离,使得算法可以独立于客户端进行变化、扩展和替换

1、场景设计

实现场景:设计A、B两种策略,同一个客户端可以根据需要从两种策略中选择使用。

2、C++实现

`Strategy` 是策略接口,定义了一个纯虚的 `execute()` 方法。`ConcreteStrategyA` 和 `ConcreteStrategyB` 是具体策略,分别实现了 `execute()` 方法来执行具体的算法。`Context` 是上下文,持有一个策略对象的指针,并且负责将客户端的请求委托给具体的策略对象。在 `main()` 函数中,我们创建了两个具体策略对象,然后通过 `Context` 对象执行了这些策略。 

#include <iostream>

// 策略接口
class Strategy {
    public:
        virtual void execute() = 0;
};

// 具体策略A
class ConcreteStrategyA : public Strategy {
    public:
        void execute() override {
            std::cout << "Executing strategy A" << std::endl;
        }
};

// 具体策略B
class ConcreteStrategyB : public Strategy {
    public:
        void execute() override {
            std::cout << "Executing strategy B" << std::endl;
        }
};

// 上下文
class Context {
    private:
        Strategy *strategy;

    public:
        Context(Strategy *strat) : strategy(strat) {}

        void setStrategy(Strategy *strat) {
            strategy = strat;
        }

        void executeStrategy() {
            if (strategy) {
                strategy->execute();
            }
        }
};

int main() {
    ConcreteStrategyA strategyA;
    ConcreteStrategyB strategyB;

    Context context(&strategyA);
    context.executeStrategy();

    context.setStrategy(&strategyB);
    context.executeStrategy();

    return 0;
}

3、Java实现

`Strategy` 是策略接口,定义了一个执行算法的方法 `execute()`。`ConcreteStrategyA` 和 `ConcreteStrategyB` 是具体策略,分别实现了 `execute()` 方法来执行具体的算法。`Context` 是上下文,维护一个对策略对象的引用,并且负责将客户端的请求委托给具体的策略对象。在 `main()` 方法中,我们创建了上下文对象,并分别设置了两种不同的策略,然后执行策略。 

package behavioralpattern.strategy;

public class StrategyDemo {
    // 策略接口
    interface Strategy {
        void execute();
    }
    // 具体策略A
    static class ConcreteStrategyA implements Strategy {
        @Override
        public void execute() {
            System.out.println("Executing strategy A");
        }
    }
    // 具体策略B
    static class ConcreteStrategyB implements Strategy {
        @Override
        public void execute() {
            System.out.println("Executing strategy B");
        }
    }
    // 上下文
    static class Context {
        private Strategy strategy;

        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }

        public void executeStrategy() {
            strategy.execute();
        }
    }
    public static void main(String[] args) {
        Context context = new Context();

        Strategy strategyA = new ConcreteStrategyA();
        Strategy strategyB = new ConcreteStrategyB();

        context.setStrategy(strategyA);
        context.executeStrategy();

        context.setStrategy(strategyB);
        context.executeStrategy();
    }
}

相关推荐

  1. 设计模式(018)行为策略模式

    2024-04-14 07:54:03       120 阅读
  2. 设计模式(015)行为模板方法模式

    2024-04-14 07:54:03       38 阅读
  3. 设计模式 行为策略模式

    2024-04-14 07:54:03       49 阅读

最近更新

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

    2024-04-14 07:54:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 07:54:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 07:54:03       87 阅读
  4. Python语言-面向对象

    2024-04-14 07:54:03       96 阅读

热门阅读

  1. cocos2dx4.0 vs编译报错

    2024-04-14 07:54:03       40 阅读
  2. ubuntu netplan 设置dns

    2024-04-14 07:54:03       125 阅读
  3. 自动化word导出

    2024-04-14 07:54:03       36 阅读
  4. 每天学习一个Linux命令之w

    2024-04-14 07:54:03       37 阅读
  5. array和vector

    2024-04-14 07:54:03       115 阅读
  6. mybatis-plus实现数据字段加解密

    2024-04-14 07:54:03       37 阅读
  7. HTML VUE

    2024-04-14 07:54:03       36 阅读
  8. 查询电脑用户名和组信息

    2024-04-14 07:54:03       34 阅读
  9. Python数据库编程实战:sqlite3模块详解

    2024-04-14 07:54:03       42 阅读
  10. MYSQL原理学习篇简记(五)

    2024-04-14 07:54:03       40 阅读