Strategy - 策略模式

定义
定义一系列的算法,把它们一个一个的封装起来,并且使它们可以相互替换,策略模式使得算法可以独立于使用者而变化。

案例
比如现在有一个文件编辑器Editor,它在保存的时候,可以保存为任意的格式。所有文件内容转换均由Convertor提供,根据不同的选择,提供不同内容转换支持:TXTConvertor,PDFConvertor,DOCConvertor等等。Editor维护对Convertor对象的一个引用,一旦要进行文件内容转换,就把职责交给Convertor对象。把转换算法和Editor分离,可以简化代码的复杂性,便于维护,又可以很好的扩充新的算法。实现的时候不一定非要使用一个公共的基类,也可以使用模板的方式进行,这里使用基类的方式:


在Editor类中维护一个Convertor对象,在保存的时候调用该对象的相关方法:
   
   
  1. class Editor
  2. {
  3. public:
  4. void save();
  5. void setConvertor(Convertor* convertor) { m_convertor = convertor; }
  6. private:
  7. string m_text;
  8. Convertor* m_convertor;
  9. };
  10. void Editor::save()
  11. {
  12. String text = m_convertor->convert(m_text);
  13. // save text to file.
  14. }
Convertor提供接口供Editor调用:
   
   
  1. class Convertor
  2. {
  3. public:
  4. vritual string& convert(const string& text) = 0;
  5. };
其子类对该方法进行不同的实现:
   
   
  1. class TXTConvertor : public Convertor
  2. {
  3. public:
  4. virtual string& convert(const string& text)
  5. {
  6. // convert to txt data.
  7. }
  8. };
  9. class PDFConvertor : public Convertor
  10. {
  11. public:
  12. virtual string& convert(const string& text)
  13. {
  14. // convert to pdf data.
  15. }
  16. };
  17. class DOCConvertor : public Convertor
  18. {
  19. public:
  20. virtual string& convert(const string& text)
  21. {
  22. // convert to doc data.
  23. }
  24. };
在使用的时候,根据不同情况设置不同Convertor:
   
   
  1. Edtior* editor = new Editor();
  2. Convertor* txtConvertor = new TXTConvertor();
  3. editor->setConvertor(txtConvertor);
  4. editor->save();
  5. ...
  6. Convertor* pdfConvertor = new PDFConvertor();
  7. editor->setConvertor(pdfConvertor);
  8. editor->save();
适用性
  • 如果许多的类之间仅仅是行为有异
  • 需要使用一个算法的不同变体
  • 算法使用用户不知道的数据,策略模式避免了暴露复杂的、与算法相关的数据结构
  • 一个类定义了多种行为,并且这些行为在这个类中是以多个条件语句方式出现的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值