九:Decorator模式(即:装饰模式)
(注2)假设有这样的一个问题存在(其实现实开发中,非常经常遇到):基类BasicClassX有N个的派生类。因为它们没有功能接口void UnknowFunction(void);
按正常的。我们的处理方法,(1) 可以通过直接修改BasicClassX基类,在此添加virtual void UnknowFunction(void);虚接口并实现,然后所有derived
class中均可见。(2) 又或是在BasicClassX基类,添加了纯虚接口,然后在具体某派生类中进行了实现。在实现使用中,用该derived class来处理。
(注3)但这样做会有这样的问题存在:a) 会有可能让继承的深度,变的很深。系统的类将变的很多,很复杂。b) 类的结构也将变的复杂化。(因为现
在是增加个接口,以后要是又有其他的接口功能需要添加了???) c) 无形中,会加重基类的负担。因为必须得保证扩展该接口,否则基类看不到该接
口。
(注1)为了解决上面的问题。Decorator模式就可以帮助我们很轻松地解决。我们实现一个Decorator类。该类,只要引用一个BasicClassX指针对象即可。
然后在Decorator类中,扩展功能接口,这样,新扩展的功能就与BasicClassX的相关类,无任何关系。只是在BasicClassX相关类需要该扩展接口的地方,
使用Decorator类来处理即可。就相当于BasicClassX的对象(或是它的derived class object)委托Decorator来实现处理一样。但又同时像是将BasicClassX
对象与Decorator对象进行组合在一起使用。从而达到新接口的扩展作用。Decorator模式就是这么回事。
下面简要提炼下Decorator类的设计
SubClassA : BasicClassX;
SubClassB : BasicClassX;
SubClassC : SubClassA;
...
SubClassN : ... : BasicClassX;
class Decorator : BasicClassX
{
public:
Decorator(BasicClassX* pBObj){m_pBOjb = pBObj;}
void DoOperate(void)
{
m_pBObj->DoOperator();
// do new interface
this->DoNewInterfaceFunction();
}
//new extened interface function
void DoNewInterfaceFunction(void){//do something...}
// new extened other interface function
...
//write down other code in here you knowned.
...
private:
BasicClassX* m_pBObj;
}
个人认为,Decorator模式,你说它有用。它确实有用。说它没用。其实它也没用。为啥这样说了?因为它完全可以通过,继承,或者直接修改原有的类体系来
实现。但它的存在,也确实会让系统的思路清晰些。至少代码相对不会那么乱。