策略模式——现代C++设计模式

策略模式——现代C++设计模式

使用场景

当我们想为一个对象设置多个处理方式时,可以选择策略模式。

实现代码

#include<vector>
#include<string>
#include<map>
#include<iostream>
#include <sstream>
using namespace std;
enum class outputformat {
    markdown,
    html
};

struct ListStrategy {
    virtual void start(ostringstream& oss) {}
    virtual void add_list_item(ostringstream& oss,const string& item) {}
    virtual void end(ostringstream& oss) {}
};

struct TextProcessor {

    ostringstream oss;  //存放输出的缓冲区
    unique_ptr<ListStrategy> list_strategy;
public:
    void append_list(const vector<string> items) {
        list_strategy->start(oss);
        for (auto& item : items)
            list_strategy->add_list_item(oss, item);
        list_strategy->end(oss);
    }
    void set_output_format(const outputformat format);


};

struct HtmlListStrategy :ListStrategy {
    virtual void start(ostringstream& oss) override { oss << "<ur>"; }
    virtual void add_list_item(ostringstream& oss, const string& item) {
        oss << " <li>" << item << " </li> ";
    }
    virtual void end(ostringstream& oss) { oss << "</ur>"; }
};

struct MarkdownListStrategy :ListStrategy {
    virtual void add_list_item(ostringstream& oss, const string& item) {
        oss << '*' << item;
    }
};

void TextProcessor::set_output_format(const outputformat format) {
    switch (format) {
    case outputformat::markdown:
        list_strategy = make_unique< MarkdownListStrategy>(MarkdownListStrategy{});
        break;
    case outputformat::html:
        list_strategy = make_unique<HtmlListStrategy>(HtmlListStrategy{});
        break;
    }
}
int main() 
{
    TextProcessor tp{};
    tp.set_output_format(outputformat::markdown);
    tp.append_list({ "hi","hello","bye" });
    cout << tp.oss.str()<< endl;

    tp.oss.str("");
   
    tp.set_output_format(outputformat::html);
    tp.append_list({ "hi","hello","bye" });
    cout << tp.oss.str() << endl;
    /*
    *hi*hello*bye
    <ur> <li>hi </li>  <li>hello </li>  <li>bye </li> </ur>
    */
    return 0;
}



代码中一共设置了两种输出模式,html和markdown格式输出,用户可以选择输出的策略,从而改变类的行为。
通过维护指向策略的指针实现调用策略,切换也非常简单!

总结

策略模式时通过定义通用的算法框架,然后以组件的形式提供框架内部流程的具体实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值