#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
/*
服饰搭配问题
*/
/*component class*/
class person
{
private:
string name;
public:
person()
{ }
person(string name)
{
this->name = name;
}
virtual void show()
{
cout <<"name is "<<name<< endl;
}
};
/*decorator class*/
class clothes: public person
{
protected:
person *man;
public:
void decorate(person *man)
{
this->man = man;
}
void show() //override
{
if(man != NULL)
{
man->show();
}
}
};
/*concrete decorate class */
class T_shirt: public clothes
{
public:
void show()
{
man->show();
add_behavior();
}
void add_behavior()
{
cout <<" T-shirt "<< endl;
}
};
class Big_trouser: public clothes
{
public:
void show()
{
man->show();
add_behavior();
}
void add_behavior()
{
cout <<" Big-trouser "<< endl;
}
};
class Big_shoe: public clothes
{
public:
void show()
{
man->show();
add_behavior();
}
void add_behavior()
{
cout <<" Big-shoe "<< endl;
}
};
class red_cat: public clothes
{
public:
void show() //core part
{
man->show();
add_behavior();
}
void add_behavior()
{
cout <<" red-cat "<< endl;
}
};
class glovers: public clothes
{
public:
void show()
{
man->show();
add_behavior();
}
void add_behavior()
{
cout <<" glovers "<< endl;
}
};
class black_bag: public clothes
{
public:
void show()
{
man->show();
add_behavior();
}
void add_behavior()
{
cout <<" black-bag "<< endl;
}
};
int main()
{ string name("xiaoming");
person *xp = new person(name);
T_shirt *Ts = new T_shirt();
black_bag *bb = new black_bag();
glovers *gl = new glovers();
red_cat *rc = new red_cat();
Ts->decorate(xp);
bb->decorate(Ts);
gl->decorate(bb);
rc->decorate(gl);
rc->show();
system("pause");
return 0;
}
总结:这不是基本代码的框架,具体框架和结构图见《大话设计模式》P51。 个人感觉核心部分是每个concretedecorate class 的operation class(这里是show())部分,有种递归的感觉。特别是最后部分(rc->show())。