装饰模式是对对象进行一个包装,这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰只关心自己的实现功能,不需要关心如何被添加到对象链中。
class Person
{
public:
Person() {}
Person(string name) :name(name) {}; // 初始化列表
virtual void show() { cout << "装扮的" << name << endl; }
private:
string name;
};
我首先确定了被装饰者的名字。提供了一个虚函数,来分离如何使用这个对象。搞清楚谁要穿衣服,提供这个人的名字信息。
class Finery : public Person//继承被装饰类
{
public:
Finery() {}
Person *component=NULL;//父类指针
void Decorate(Person *component)
{//把传入的实例赋值给父类指针
this->component = component;
}
virtual void show()
{
//重写了装扮
component->show();
}
};
下面就是每个装饰对象的具体功能实现,不需要关心任何被添加到对象中。
我啥也不知道,我就干个穿衣服,穿给谁,谁要穿,怎么穿,我都不需要知道。
class TShirts : public Finery
{
public:
virtual void show()
{
cout << "大体恤 " << endl;
}
};
class BigTrouser : public Finery
{
public:
virtual void show()
{
cout << "大裤衩子 " << endl;
}
};
下面是客户端代码
int main()
{
Person *p = new Person("草泥马");//生成需要装扮的对象
Finery *f = new Finery();//生成一个服饰类提供穿衣服的功能
TShirts *z = new TShirts;//需要穿什么衣服,就把衣服找到
f->Decorate(z);//
f->show();//穿上衣服了
getchar();
}
总觉得自己写的缺陷多多,面向对象博大精深,只能学个皮毛了!