上一次我们谈到了面向对象中一个设计模式:装饰器模式。
我们现在来看一下在没有Python这样装饰器机制的情况下,如何来实现这样的装饰器模式:
我们下面拿C++语言来示例:
看下面一个例子:
class Cake
{
public:
virtual void showCake() = 0; // 接口
virtual ~Cake() {};
std::string name;
};
class ConcreteCake :public Cake
{
public:
ConcreteCake()
{
name = "原始蛋糕";
}
void showCake() { std::cout << name.c_str() << std::endl; };
virtual ~ConcreteCake() {};
};
class CakeDecrator :public Cake
{
protected:
Cake* pCake; //维护一个Cake对象的引用,为Cake对象添加装饰
public:
virtual void showCake() = 0; // 有接口,是抽象类
virtual ~CakeDecrator() {};
};
class CakeDecratorMilk : public CakeDecrator
{
public:
CakeDecratorMilk(Cake* pCake)
{
this->pCake = pCake;
}
void showCake()
{
this->name = pCake->name + "加奶油";
std::cout << name.c_str() << std::endl;
};
virtual ~CakeDecratorMilk() {};
};
// 这样我们可以来测试一下程序
int main()
{
# 原味的蛋糕
ConcreteCake *pConCake = new ConcreteCake();
pConCake->showCake(); //原始蛋糕
CakeDecratorMilk* pDecMilk = new CakeDecratorMilk(pConCake);
pDecMilk->showCake(); //原始蛋糕加奶油
delete pConCake;
delete pDecMilk;
return 0;
}
这样,如果有一天,我们希望在现在的奶油蛋糕上再增加其他的味道,比如巧克力,则可以这样:
添加一个新的类
class CakeDecratorCholate : public CakeDecrator
{
public:
CakeDecratorCholate(Cake* pCake)
{
this->pCake = pCake;
}
void showCake()
{
this->name = pCake->name + "加巧克力";
std::cout << name.c_str() << std::endl;
};
virtual ~CakeDecratorCholate() {};
};
// 然后可以写出下面的测试代码:
int main()
{
ConcreteCake *pConCake = new ConcreteCake();
pConCake->showCake(); // 原始蛋糕
CakeDecratorMilk* pDecMilk = new CakeDecratorMilk(pConCake);
pDecMilk->showCake(); // 原始蛋糕加奶油
CakeDecratorCholate *pDecCho = new CakeDecratorCholate(pDecMilk);
pDecCho->showCake(); // 原始蛋糕加奶油加巧克力
delete pConCake;
delete pDecMilk;
delete pDecCho;
return 0;
}
我们发现,这里也没有修改过原来的代码逻辑,而是通过扩充一个类的方式来实现装饰器的效果(扩充功能)。
这就是在C++中实现装饰器模式的过程,我们发现需要引入一个中间的类CakeDecrator ,来帮助我们完成新类对原来类的扩充。这也是面向对象编程,面向对象设计模式的精髓之处。
下面几节,我们会一步步来讨论面向对象的设计模式及23中常见的面向对象的设计模式。