设计模式学习 C++实现之策略模式

这里说一点自己对策略模式的粗略理解,希望后面回顾的时候,能一步步加深理解

什么情况下可以使用策略模式?

1、出现同一抽象有多个子类,需要用if-else或者switch-case来选择使用哪个子类的时候

2、对同一类型问题有不同的处理方式


需要三个部分:

1、策略接口(IStrategy):策略的基类

2、策略具体实现:各个策略的具体实现

3、策略环境(CContext):拥有一个策略引用

最后是通过这个策略环境来调用各个策略的


实现:

具体应用到当前场景,策略就是诸葛亮给赵云的三个妙计,策略环境即是锦囊,策略的执行者是赵云,赵云依次从锦囊中取出妙计,依计行事,最后成功让刘备娶得孙小妹

#ifndef STRATEGY_H
#define STRATEGY_H

#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;

//策略接口
class IStrategy{
public:
    IStrategy(){}
    virtual ~IStrategy(){}
    virtual void Operate() = 0;
};

//策略:找乔国老帮忙,使孙权不能杀刘备
class CBackDoor: public IStrategy{
public:
    CBackDoor(): IStrategy() {}
    ~CBackDoor() {}
    void Operate(){ printf("找乔国老帮忙,让吴国太给孙权施加压力\n"); }
};

//策略:让吴国太给开绿灯
class CGivenGreenLight: public IStrategy{
public:
    void Operate() { printf("求吴国太开个绿灯,放行!\n"); }
};

//策略:孙夫人断后,挡住追兵
class CBlockEnemy: public IStrategy{
public:
    void Operate() { printf("孙夫人断后,挡住追兵\n"); }
};

//计谋有了,那还需要锦囊呢
class CContext{
public:
    CContext(IStrategy *_strategy){ strategy = _strategy; }
    //该使用计谋了,看我出招
    void Operate(){ strategy->Operate(); }
private:
    IStrategy *strategy;
};

//赵云出场,他根据诸葛亮给他的交代,依次拆开妙计
class CZhaoYun{
public:
    void run(){
        CContext *context;

        printf("------------刚刚到吴国的时候拆开第一个------------\n");
        context = new CContext(new CBackDoor());
        context->Operate();
        printf("\n\n\n\n");

        printf("------------刘备乐不思蜀了,拆开第二个------------\n");
        context = new CContext(new CGivenGreenLight());
        context->Operate();
        printf("\n\n\n\n");

        printf("------------孙权小兵追了,咋办,拆开第三个------------\n");
        context = new CContext(new CBlockEnemy());
        context->Operate();
        printf("\n\n\n\n");
    }
};

#endif // STRATEGY_H


源码参考《24种设计模式介绍与6大设计原则》一书

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值