前言:
最近在研究自己的架构,所以去看了一些设计模式,是不是可以在自己的架构中使用,让自己的架构更加的完美,(之前的架构完全是自己凭借自己的主观意识去写的所以很乱。)看到设计模式 Decorator模式,卡住了,不是看不懂,而是不明白Decorator模式和派生子类的区别有什么不同之处,很费解,网上各位的解答也没有让我说出这两个的具体区别在哪里,所以还是自己理解理解,加深自己的印象,理解错误了 希望大家指出。
什么是Decorator模式:
用Decorator类给类添加其他作用的方法,而不是通过继承的方式来添加方法。减少系统复杂度和继承的深度。
结构图:
从上图可以看出Component是一个虚基类。他的子类ConcreteComponent是具体的实例类。比如:Component是表示动物类,它"会吃"是这个类的接口,而ConcreteComPonent是表示一个具体的动物,比如人。而Decorator这个类也是继承Component他是来装饰动物这个类派生的具体实例类。如果只有一种装饰 。就这个装饰,我们可以不必去重写Decorator类,但是如果是一种装饰,也没有必要用这种模式 直接用继承模式也就行了,所以我们这里注重的还是添加多种装饰。
这里举例2种装饰:1. 人吃饭前煮饭,2.吃完饭洗碗
ComcreteDecorator类就表示具体的装饰。我们下面会列出具体代码:1. 人吃饭前煮饭 =ComcreteDecoratoA 2.吃完饭洗碗 =ComcreteDecoratoB
ComcreteDecoratoA 在创建的时候传入Component指针,然后再内部用Component的对象指针调用Operation,实际上操作的是ConcreteComponent的对象。
所以在ComcreteDecoratoA 对象调用Operation方法,在调用的方法里面调用一个添加一个“洗手”的方法,再用传进来的Component对象调用Operation,这样实际调用了ConcreteComponent人吃饭,这样就在ConcreteComponent 吃饭前 调用了洗手了。
具体代码:
class Component
{
public:
virtual void Operation()=0;
};
class ConcreteCompontent: public Component
{
public:
void Operation()
{
cout << "吃饭"<<endl;
}
};
class Decorator:public Component
{
public:
Component* pcom;
Decorator(Component* pcom)
{
this->pcom = pcom;
}
void Operation()
{
}
};
class ComcreteDecoratoA :public Decorator
{
public:
ComcreteDecoratoA(Component* pcom):Decorator(pcom)
{
}
void Operation()
{
Addfun();
pcom->Operation();
}
void Addfun()
{
cout << "洗手"<<endl;
}
};
class ComcreteDecoratoB :public Decorator
{
public:
ComcreteDecoratoB(Component* pcom):Decorator(pcom)
{
}
void Operation()
{
pcom->Operation();
Addfun();
}
void Addfun()
{
cout << "洗碗"<<endl;
}
};
void main()
{
Component *pcom=new ConcreteCompontent: ();
Decorator *pdec = new ComcreteDecoratoA(pcom);
pdec->Operation();
Decorator *pdec2 = new ComcreteDecoratoB(pcom);
pdec2->Operation();
}
//输出 :
1.洗手
2.吃饭
3.吃饭
4.洗碗
这里就添加了两个装饰