⭐ 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换。策略模式让算法独立于使用它的客户而独立变化,即算法的变化,不会影响到使用算法的客户。 |
个人理解,通俗来讲就是策略模式的点在于封装变化。举个例子,画家画画,他能画国画、蜡笔画、油画等等,画各种风格的画用的画笔不一样、颜料不一样……那这些不同方式的画画其实就是变化的算法(策略)。如果将实现这些画画的代码都集成在画家类中,日后一旦任何一种画画方式发生改变就需要去修改画家类,就违反开放-封闭原则。
代码如下(偷懒了,类没有加构造和析构)
#include <iostream> #include <string> using namespace std;
class BrushStrategy { public: virtual void Paint() = 0; };
class Pastel :public BrushStrategy { public: virtual void Paint() { std::cout << "paint with pastel" << endl; } };
class ChinesePen :public BrushStrategy { public: virtual void Paint() { std::cout << "paint with chinese-pen" << endl; } };
class Painter { public: void Paint() { m_brush->Paint(); } void SetBrush(BrushStrategy *i_Brush) { m_brush = i_Brush; }
private: BrushStrategy *m_brush;
};
class BrushFactory { public: BrushStrategy *CreateBrush(int nType) { BrushStrategy *brush = NULL; switch (nType) { case 1: brush = new ChinesePen; break; case 2: default: brush = new Pastel; break; } return brush; }
};
int main() { Painter painter; BrushFactory bfc; BrushStrategy *chinese_pen = bfc.CreateBrush(1); painter.SetBrush(chinese_pen); painter.Paint(); delete chinese_pen; chinese_pen = NULL;
BrushStrategy *pastel = bfc.CreateBrush(2); painter.SetBrush(pastel); painter.Paint(); delete pastel; pastel = NULL;
return 1; } |
结果如下: