带你深入浅出设计模式:二、策略模式——编程界的瑞士军刀

此为设计模式谈!

总-分-总的结构生活化的例子给你讲解设计模式!

码农不易,各位学者学到东西请点赞收藏支持支持

开始部分:

总:策略模式的本质:分离算法选择实现。代表性应用有支付方式的选择,文件压缩等等。

分:

1.老规矩,在vs中创建一个控制台应用

2.实现编码,这里使用了旅行出行方式作为例子

2.1 策略模式有三大模块,Context上下文、Strategy策略接口、ConcreateStrategy具体策略实现

2.2 飞机、火车、汽车类的重写函数是具体策略的实现

2.3 旅行者则是上下文,选择什么策略由他来决定

2.4 策略接口则是交通工具这个大类

#include <iostream>
using namespace std;

// 定义抽象策略接口:交通工具
class TravelStrategy {
public:
    virtual void travel() const = 0; // 纯虚函数,定义旅行方式
    virtual ~TravelStrategy() {} // 虚析构函数,确保正确析构
};

// 具体策略:飞机
class Plane : public TravelStrategy {
public:
    void travel() const override {
        cout << "乘坐飞机,快速抵达目的地。" << endl;
    }
};

// 具体策略:火车
class Train : public TravelStrategy {
public:
    void travel() const override {
        cout << "乘坐火车,欣赏沿途风景。" << endl;
    }
};

// 具体策略:汽车
class Car : public TravelStrategy {
public:
    void travel() const override {
        cout << "驾驶汽车,自由行进。" << endl;
    }
};

// 上下文:旅行者
class Traveler {
private:
    TravelStrategy* strategy; // 旅行策略
public:
    Traveler(TravelStrategy* strat) : strategy(strat) {}
    ~Traveler() {
        // 不再释放策略
    }
    void setStrategy(TravelStrategy* strat) { // 设置新的旅行策略
        // 不再释放旧策略
        strategy = strat;
    }
    void makeTrip() const { // 进行旅行
        cout << "开始旅行...\n";
        strategy->travel();
        cout << "旅行结束。\n";
    }
};

int main() {
    // 创建不同的策略(交通工具)
    TravelStrategy* plane = new Plane();
    TravelStrategy* train = new Train();
    TravelStrategy* car = new Car();

    // 创建旅行者并设置初始策略
    Traveler traveler(plane);
    traveler.makeTrip(); // 使用飞机策略去旅行

    // 更改策略,使用火车去旅行
    traveler.setStrategy(train);
    traveler.makeTrip();

    // 再次更改策略,使用汽车去旅行
    traveler.setStrategy(car);
    traveler.makeTrip();

    // 释放策略对象
    delete plane;
    delete train;
    delete car;

    return 0;
}

3.这里有三大模块的结构图来辅助理解策略模式

总:策略模式的优点:避免了多重的if-else语句;更有拓展性和维护。因为可拓展,所以像瑞士军刀,加各种策略解决不同的问题。

缺点:客户必须了解每种策略的不同,适合扁平的算法结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值