1合成模式的核心内容是:
略:
2状态模式的作用:略。
3状态模式具体描述
合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。
合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。
合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。
Mary今天过生日。“我过生日,你要送我一件礼物。”
嗯,好吧,去商店,你自己挑。”
“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买
。”“喂,买了三件了呀,我只答应送一件礼物的哦。
”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。
”“……”,MM都会用Composite模式了,你会了没有?
4合成模式类图
5.代码:
#include<iostream>
#include
<vector>
#include
<string>
using
namespace
std;
//合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。
//合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。
//合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。
//
//Mary今天过生日。“我过生日,你要送我一件礼物。”
//嗯,好吧,去商店,你自己挑。”
//“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买
//。”“喂,买了三件了呀,我只答应送一件礼物的哦。
//”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。
//”“……”,MM都会用Composite模式了,你会了没有?
//组件类
class
Component
{
public:
//组件名称
string
name;
Component(string
name)
{
this->name
= name;
}
//添加组件
virtual
void
add(Component
*) = 0;
//删除组件类
virtual
void
remove(Component
*) = 0;
//显示
virtual
void
display(int)
= 0;
};
class
Leaf :public
Component
{
public:
Leaf(string
name) :Component(name)
{}
void
add(Component
*c)
{
cout <<
"leaf cannotadd"<<
endl;
}
void
remove(Component
*c)
{
cout <<
"leaf cannotremove"<<
endl;
}
void
display(int
depth)
{
string
str(depth,
‘-‘);
str +=
name;
cout <<
str <<
endl;
}
};
class
Composite :public
Component
{
private:
vector<Component*>
component;
public:
Composite(string
name) :Component(name)
{}
void
add(Component
*c)
{
component.push_back(c);
}
void
remove(Component
*c)
{
vector<Component*>::iterator
iter =
component.begin();
while (iter
!= component.end())
{
if (*iter
== c)
{
component.erase(iter);
}
iter++;
}
}
void
display(int
depth)
{
string
str(depth,
‘-‘);
str +=
name;
cout <<
str <<
endl;
vector<Component*>::iterator
iter =
component.begin();
while (iter
!= component.end())
{
(*iter)->display(depth
+ 2);
iter++;
}
}
};
//显示了树状结构
int
main()
{
Component *p
= new
Composite("小李");
p->add(new
Leaf("小王"));
p->add(new
Leaf("小强"));
Component *sub
= new
Composite("小虎");
sub->add(new
Leaf("小王"));
sub->add(new
Leaf("小明"));
sub->add(new
Leaf("小柳"));
p->add(sub);
p->display(0);
cout <<
"*******" <<
endl;
sub->display(2);
cin.get();
return 0;
}
运行结果如下: