装饰模式
实现一个穿衣服的程序:
先看uml图:
因为我们这里只有concreteconponent类 也就是Person类,并没有抽象类Conponent类,所以就可以让Decorate类也就是Clothes是Person的一个子类。同理如果只有一个concreDecorate类,就不用在单独建造一个Decorate类。
下面是代码,可以copy到本地跑一下。
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
class Person{
private :
string name;
public:
Person(){};
Person(string name) : name(name){};
virtual void show(){
cout<<"装扮的"<<name<<endl;
}
};
class Clothes : public Person{
protected:
Person* component;
public:
void Decorate(Person* component){
this->component = component;
}
virtual void show(){
if(component != NULL ){
component->show();
}
}
};
class Tshirt : public Clothes{
public:
virtual void show(){
cout<<"T-shirt ";
Clothes::show();
}
};
class Coat : public Clothes{
public:
virtual void show(){
cout<<"Coat ";
Clothes::show();
}
};
class Suit : public Clothes{
public:
virtual void show(){
cout<<"Suit ";
Clothes::show();
}
};
class DownCoat : public Clothes{
public:
virtual void show(){
cout<<"Down-Coat ";
Clothes::show();
}
};
class Bra : public Clothes{
public:
virtual void show(){
cout<<"Bra ";
Clothes::show();
}
};
class Jeans : public Clothes{
public:
virtual void show(){
cout<<"Jeans ";
Clothes::show();
}
};
class SportPants : public Clothes{
public:
virtual void show(){
cout<<"Sport-Pants ";
Clothes::show();
}
};
class SuitTrousers : public Clothes{
public:
virtual void show(){
cout<<"SuitTrousers ";
Clothes::show();
}
};
class Underpants : public Clothes{
public:
virtual void show(){
cout<<"Underpants ";
Clothes::show();
}
};
class Slipper : public Clothes{
public:
virtual void show(){
cout<<"Slipper ";
Clothes::show();
}
};
class Sneakers : public Clothes{
public:
virtual void show(){
cout<<"Sneakers ";
Clothes::show();
}
};
class LeatherShoes : public Clothes{
public:
virtual void show(){
cout<<"LeatherShoes ";
Clothes::show();
}
};
class Scarf : public Clothes{
public:
virtual void show(){
cout<<"Scarf ";
Clothes::show();
}
};
class Glove : public Clothes{
public:
virtual void show(){
cout<<"Gloves ";
Clothes::show();
}
};
class Cap : public Clothes{
public:
virtual void show(){
cout<<"Cap ";
Clothes::show();
}
};
int main(){
Person* ts = new Person("ts");
cout<<"第一次穿衣服:"<<" ";
Tshirt* tst = new Tshirt;
Underpants* ps = new Underpants;
Sneakers* ss = new Sneakers;
Cap* cp = new Cap;
cp->Decorate(ts);
ss->Decorate(cp);
ps->Decorate(ss);
tst->Decorate(ps);
tst->show();
cout<<"第一次穿衣服结束"<<endl;
cout<<"第二次穿衣服:"<<" ";
Scarf* sf = new Scarf;
Slipper* sp = new Slipper;
DownCoat* dc = new DownCoat;
Jeans* js = new Jeans;
sf->Decorate(ts);
sp->Decorate(sf);
js->Decorate(sp);
dc->Decorate(js);
dc->show();
cout<<"第二次穿衣服结束"<<endl;
}
输出结果
第一次穿衣服: T-shirt Underpants Sneakers Cap 装扮的ts
第一次穿衣服结束
第二次穿衣服: Down-Coat Jeans Slipper Scarf 装扮的ts
第二次穿衣服结束