本文主要是介绍9、组合模式(结构性模式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
组合模式又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构,以一致的方式处理个别(叶子)对象以及组合对象,不以层次高低定义类,都是结点类
举例,大学、学院、系,它们之间不是继承关系,是组合关系:大学由学院组成,学院由系组成,但是它们都是组织结点,一个大学,n个学院,一个学院m个系,大学、学院是 组合类型的,它们都包含结点成员,系是 叶子类型 的,不包含结点成员
把大学、学院、系抽象为组织结点类,都是结点类的子类(其中大学子类、学院子类是组合类型的类,系是叶子类型的类),按照具体依赖抽象原则,以子类共有的属性和行为来定义结点类,代码如下:
//组织结点(基类)Organization
class Organization{ //具体依赖抽象原则std::string name;//数据成员
public:Organization( std::string name):name(name) { }//构造函数virtual ~Organization(){ } //虚析构//其他成员函数virtual std::string getName(){ return name; } virtual void add(Organization* o){ throw "叶子结点没有成员!\n"; }//virtual void remove( ){ throw "叶子结点没有成员!\n"; }virtual void print() = 0; //
};
组合类型的子类University、College,重写基类成员函数,代码几乎一样
//组合类型(子类)University College
//University
class University:public Organization{std::list<Organization*> ul; //以基类的形式包含其他子类对象
public:University(std::string name):Organization(name) { }~University(){std:: cout << "~University\n";for(auto o:ul){ delete o; } }//重写virtual void add(Organization* o){ul.push_back(o);}virtual void print(){std::cout << getName() << "\n";//基类成员获取,基类的成员也是子类的组成部分for( auto o:ul ){o->print();}}
};//College
class College:public Organization{std::list<Organization*> cl; //以基类的形式包含其他子类对象
public:College(std::string name):Organization(name) { }~College(){std:: cout << "~College\n";for(auto o:cl){ delete o; } }//重写virtual void add(Organization* o){cl.push_back(o);}virtual void print(){std::cout << getName() << "\n";//基类成员获取,基类的成员也是子类的组成部分for( auto o:cl ){o->print();}}
};
叶子类型的子类(Department)
//叶子类型(子类)Department
class Department:public Organization{
public:Department(std::string name):Organization(name) { }~Department(){std:: cout << "~Department\n";}//重写virtual void print(){std::cout << getName() << "\n";}
};
头文件及测试代码
#include <iostream>
#include <string>
#include <exception>
#include <list>int main()
{University u("清华大学");Organization* c1 = new College("计算机学院");Organization* c2 = new College("信息工程学院");Organization* d = new Department("信息工程");u.add( c1 );u.add( c2 );c2->add( d );u.print();//c2->print(); return 0;
}
这篇关于9、组合模式(结构性模式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!