前四个设计原则最为重要
定义一个操作中的算法骨架,而将一些步骤延迟到子类中
Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
某一个表演有一套特定的展示流程,但是其中有若干个表演子流程可创新替换,宜昌市迭代更新表演流程
通过固定算法骨架来约束子类的行为
#include using namespace std;class Perform {
public:void show() {if (show0())playGame();show1();show2();show3();}private:void playGame() {cout << "show0 end, have a small game" << endl;}protected:virtual bool show0() {cout << "show0" << endl;return true;}virtual void show1() {}virtual void show2() {cout << "show2" << endl;}virtual void show3() {}
};class PerformEx1 : public Perform {
protected:virtual bool show0() {cout << "ex1 show0" << endl;return true;}virtual void show2() {cout << "ex1 show2" << endl;}
};class PerformEx2 : public Perform {
protected:virtual void show1() {cout << "ex2 show1" << endl;}virtual void show2() {cout << "ex2 show2" << endl;}
};class PerformEx3 : public Perform {
protected:virtual void show1() {cout << "ex3 show1" << endl;}virtual void show2() {cout << "ex3 show2" << endl;}virtual void show3() {cout << "ex3 show3" << endl;}
};int main()
{Perform *p1 = new PerformEx1();p1->show();cout << "====================" << endl;Perform *p2 = new PerformEx2();p2->show();cout << "====================" << endl;Perform *p3 = new PerformEx3();p3->show();cout << "====================" << endl;return 0;
}
补充:
定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
气象站发布气象资料给数据中心,数据中心经过处理,将气象信息更新到不同的显示终端上
触发联动
#include
#include using namespace std;class IDisplay
{
public:virtual void show(float temperature) = 0;virtual ~IDisplay() {}
};class DisplayA : public IDisplay
{
public:virtual void show(float temperature);private:void ownFunction(); // 可以在子类上继续添加自己需要的函数
};class DisplayB : public IDisplay
{
public:virtual void show(float temperature);
};class DisplayC : public IDisplay
{
public:virtual void show(float temperature);
};class WeatherData
{};class DataCenter
{
public:bool attach(IDisplay *ob);bool detach(IDisplay *ob);void notify(){float temperature = CalcTemperature();for (auto iter = this->obs.begin(); iter != obs.end(); iter++)(*iter)->show(temperature);}
private:virtual WeatherData *GetWeatherData();virtual float CalcTemperature(){WeatherData *data = GetWeatherData();// ...float temperature;return temperature;}std::vector obs;
};int main()
{DataCenter *center = new DataCenter;IDisplay *da = new DisplayA();IDisplay *db = new DisplayB();IDisplay *dc = new DisplayC();center->attach(da);center->attach(db);center->attach(dc);center->notify();center->detach(db);center->notify();return 0;
}
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换,该模式使得算法可独立于使用它的客户程序而变化
某商场节假日有固定促销活动,为了加大促销力度,现提升国庆节促销活动规格
分离算法,选择实现
#include using namespace std;class Context
{// 环境类
};class ProStrategy
{// 抽象的策略类
public:// 算法接口virtual double CalcPro(const Context &ctx) = 0;virtual ~ProStrategy();
};// 派生出的具体策略类
class VAC_Spring : public ProStrategy {
public:virtual double CalcPro(const Context &ctx){}
};class VAC_Labor : public ProStrategy {
public:virtual double CalcPro(const Context &ctx){}
};
class VAC_Labor1 : public VAC_Labor {
public:virtual double CalcPro(const Context &ctx){}
};class VAC_National : public ProStrategy {
public:virtual double CalcPro(const Context &ctx){}
};class VAC_Christmas : public ProStrategy {
public:virtual double CalcPro(const Context &ctx){}
};class Promotion
{
public:Promotion(ProStrategy *s) : s(s){}~Promotion(){}double CalcPromotion(const Context &ctx) {return s->CalcPro(ctx);}
private:ProStrategy *s;
};int main()
{Context ctx;ProStrategy *s = new VAC_Labor1();Promotion *p = new Promotion(s);p->CalcPromotion(ctx);return 0;
}
补充: