今天学习了那个装饰模式,顾名思义就是,保持原来的基本不变,然后要什么就添加什么。就好比一个人穿衣服,这个人没有变胖或者变瘦,也没有变高或变矮,就是单纯地 添加衣服裤袜,就会觉得这个人看上去不同了。在书本上的定义是:装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
下面就是对书本中代码的实践,主要是通过 Decorate函数来记录该对象中添加了另一个类的对象,然后调用component来实现调用另一个对象的函数来实现功能的添加。代码主要如下:
// decorator.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Person
{
private:
string name;
public:
Person()
{}
Person(string name)
{
this->name = name;
}
virtual void Show()
{
cout<<"装扮的"<<Person::name;
}
};
class Finery : public Person
{
protected:
Person *component;
public:
void Decorate(Person *component)
{
this->component = component;
}
void Show()
{
component->Show();
}
};
class TShirt : public Finery
{
public:
void Show()
{
cout<<"大T恤";
Finery::Show();
}
};
class BigTrouser : public Finery
{
public:
void Show()
{
cout<<"垮裤";
Finery::Show();
}
};
class Sneakers : public Finery
{
public:
void Show()
{
cout<<"破球鞋";
Finery::Show();
}
};
class Suit : public Finery
{
public:
void Show()
{
cout<<"西装";
Finery::Show();
}
};
class Tie : public Finery
{
public:
void Show()
{
cout<<"领带";
Finery::Show();
}
};
class LeatherShoes : public Finery
{
public:
void Show()
{
cout<<"皮鞋";
Finery::Show();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Person *xc = new Person("小菜");
cout<<"第一种装扮"<<endl;
Sneakers *pqx = new Sneakers();
BigTrouser *kk = new BigTrouser();
TShirt *dtx = new TShirt();
pqx->Decorate(xc);
kk->Decorate(pqx);
dtx->Decorate(kk);
dtx->Show();
system("pause");
return 0;
}
上述的例子就是利用Decorate来对对象进行包装,这样每个装饰对象的实现和如何利用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
装饰模式就是在已有功能的基础上添加新的功能而不改变原来功能类。它提供了一个很好的思路就是,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当我们需要用到某个功能的时候,就可以调用装饰功能去包装我们需要的功能类。
该模式最大的优点就是有效地把类的核心功能和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。另外这样也可以让一个功能类简化,把功能类简化为各种独立功能,需要的时候再添加,减低一个类的职责。(这个是个人理解)