将所有的解决方案提前设定好,不根据当前的情况做判断,将不同问题的不同的解决方案一一对应起来。例如:如果我们周一到周三上早班,闹钟应该定在7:00;周四、周五上晚班,闹钟定在10:00;那么定两个闹钟,周一到周三:7:00,周四、周五:10:00。将问题和方案进行映射处理,不需要每次去判断。
三:装饰者模式
参考:
https://www.cnblogs.com/stonefeng/p/5679638.html 一个面馆中面条作为主食,面条中可以添加牛肉、鸡蛋等两种配料,这两种配料客户可以自由选择是否添加,每种配料的价格都不一样。面条3元,牛肉5元,鸡蛋3元。
实现方法:
(1)定义被装饰者类(面条类,所有的方法必须都是虚的)
//定义被装饰者面条类
class Noodles
{
public:
Noodles()
{
}
virtual ~Noodles() //抽象类的析构函数必须是虚函数
{
}
virtual int getPrince() //得到价格
{
return 3; //面条是3元
}
virtual QString getDescription() //得到描述的内容
{
return "noodles"; //返回描述
}
};
(2)继承被装饰者类,并且重写被装饰者类的所有方法
实现牛肉这一装饰者//为面条加上牛肉的装饰者
class BeefNoodles : public Noodles
{
private:
Noodles *m_Noodles; //定义被装饰者,指针可以指向任何一个装饰者
public:
BeefNoodles(Noodles *noodles)
{
m_Noodles=noodles;
}
int getPrince() //得到对应的价格
{
return m_Noodles->getPrince()+5; //牛肉面需要加5元
}
QString getDescription() //得到描述
{
return m_Noodles->getDescription()+",beef"; //加上牛肉的描述
}
};
实现鸡蛋装饰者//为面条加上鸡蛋的装饰者
class EggNoodles : public Noodles
{
private:
Noodles *m_Noodles; //定义被装饰者
public:
EggNoodles(Noodles *noodles)
{
m_Noodles=noodles;
}
int getPrince() //得到对应的价格
{
return m_Noodles->getPrince()+3; //鸡蛋需要3元
}
QString getDescription() //得到描述
{
return m_Noodles->getDescription()+",egg"; //加上鸡蛋的描述
}
};
注意:装饰者类必须拥有被装饰者的对象(3)使用装饰者组合产品
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
noodles=new BeefNoodles(noodles); //为面条添加牛乳装饰者
qDebug()<<noodles->getDescription()<<":"<<noodles->getPrince();//打印出产品信息
noodles=new EggNoodles(noodles); //为面条添加鸡蛋装饰者
qDebug()<<noodles->getDescription()<<":"<<noodles->getPrince();//打印出产品信息
return a.exec();
}
输出信息: