设计模式是人们从长期的软件开发实战中总结出来的一些经验之谈,为软件领域中的开发人员提供了一种使用专家设计经验的有效途径,通常是多个设计模式结合使用。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,只有通过大量的编程实践才能真正领悟设计模式的精髓。在参加校招前我翻看了部分设计模式相关的书,对于每个设计模式模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式》两本书以及借鉴其他博客园博文的优秀部分。本文介绍观察者模式的实现。希望对大家加深对设计模式的理解有一点帮助。
将对象组合成树形结构以表示“部分-整体”的层次结构。C o m po s i t e 使得用户对单个对象和组合对象的使用具有一致性。
- 你想表示对象的部分-整体层次结构。
- 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
一、举例
这个例子是书上的,假设有一个公司的组结结构如下:
它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点。
而且最关健的是,它的每一层结构都很相似。
代码实现如下:
#include
#include
#include
usingnamespace std;
//公司类,提供接口
classCompany
{
public:
Company(stringname)
{
m_name=name;
}
virtual~Company()
{}
virtualvoidAdd(Company*pCom)
{}
virtualvoidDisplay(intdepth)
{}
protected:
stringm_name;
};
//具体公司
classConcreteCompany:publicCompany
{
public:
ConcreteCompany(stringname):Company(name)
{}
virtual~ConcreteCompany()
{}
//增加子树或叶子
voidAdd(Company*pCom)
{
m_listCompany.push_back(pCom);
}
//显示
voidDisplay(intdepth)
{
for(inti=0;i
::iteratoriter=m_listCompany.begin();
for(;iter!=m_listCompany.end();iter++)//显示下层结点
{
(*iter)->Display(depth+2);
}
}
private:
list
m_listCompany;
};
//具体的部门,财务部
classFinanceDepartment:publicCompany
{
public:
FinanceDepartment(stringname):Company(name)
{}
virtual~FinanceDepartment()
{}
//只需显示,无限添加函数,因为已是叶结点
virtualvoidDisplay(intdepth)
{
for(inti=0;i
Add(leaf1); root->Add(leaf2); //华东分公司 Company*mid1=newConcreteCompany("华东分公司"); Company*leaf3=newFinanceDepartment("华东分公司财务部"); Company*leaf4=newHRDepartment("华东分公司人力资源部"); mid1->Add(leaf3); mid1->Add(leaf4); root->Add(mid1); //南京办事处 Company*mid2=newConcreteCompany("南京办事处"); FinanceDepartment*leaf5=newFinanceDepartment("南京办事处财务部"); HRDepartment*leaf6=newHRDepartment("南京办事处人力资源部"); mid2->Add(leaf5); mid2->Add(leaf6); root->Add(mid2); //杭州办事处 Company*mid3=newConcreteCompany("杭州办事处"); FinanceDepartment*leaf7=newFinanceDepartment("杭州办事处财务部"); HRDepartment*leaf8=newHRDepartment("杭州办事处人力资源部"); mid3->Add(leaf7); mid3->Add(leaf8); mid2->Add(mid3); root->Display(0); deleteleaf1; deleteleaf2; deleteleaf3; deleteleaf4; deleteleaf5; deleteleaf6; deleteleaf7; deleteleaf8; deletemid1; deletemid2; deleteroot; return0; }
二、说明
1. 上面公司的结构图其实就是整体与部分的关系,而且的话整体与部分可以一致对待,因为有很多相似之处嘛。
2. 这棵树有两种几能,要么是棵叶,要么是子棵。
其实这种模式就是组合模式。
三、组合模式
定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。
要注意两点:
1. “树形”,必须是一种层次结构,有可以向下延伸的分枝,也有不变的树叶。
2. "一致性",也就是要具有很多相似性。
结构图如下:
component:主要是定义统一的接口,说白了也就是提取出相似性。
composite:定义分枝节点,也就是子树。
leaf:定义叶节点,叶节点是没有子节点的。
好啦,关于组合模式就介绍到这里了,希望你已经掌握了这个模式并且可以熟练的使用它,那么本博文的效果就达到了。如果你还觉得意犹未尽,那么可以去看看博主的其他设计模式的介绍哦。
关于设计模式,我推荐大家看看以下博客写的博文,关于设计模式的讲解将的特别好,我从中学习了很多,我的设计模式中的部分博文就是从这里借鉴过来的。
关于设计模式,我推荐大家看看以下博客写的博文,关于设计模式的讲解将的特别好,我从中学习了很多,我的设计模式中的部分博文就是从这里借鉴过来的。
博客链接:http://blog.youkuaiyun.com/wuzhekai1985