1、引言
本篇内容主要是介绍C++中类与类之间Composition(复合)、Delegation(委托)和Inheritance(继承)的基本设计模式,如Adapter、pimpl、Template Method、Observer、Composite和Prototype。
2、Composition的用法
1) Contaner与Compoent
2)两者间关系
注意点:
a、这是一种Adapter(适配器)的设计模式,适用于只开放部分类方法的情形,且在Adapter中实现部分方法的调用,是对一个类的封装的用法;
b、Contaner的构造函数首先调用Component的默认构造函数,然后才执行自己;
c、Container的析构函数首先执行自己,然后才调用Component的析构函数;
d、构造函数与析构函数是内外同步的。
3、Delegation(Composition by reference)的用法
1)、Handle/Body
2)两者间关系
注意点:
a、这种委托的实现方式是通过pimpl(point to implementation)设计模式实现,即通过针对变量指向一个类;
b、构造函数和析构函数在两者间是不同步的;
c、Handle部分提供的是接口部分,底层可以通过Body部分实现不同的操作;
4、Inheritance的用法
1)继承的关系
注意点:
a、构造函数由内而外,即Derived的构造函数首先调用Base的默认构造函数,然后才执行自己;
b、析构函数由外而内,即Derived的析构函数首先执行自己,然后才调用Base的析构函数;
c、base类的析构函数必须是virtual,否则会出现未定义的行为。
2)继承与虚函数
通过类成员函数有三种:非虚函数、虚函数和纯虚函数。
- 非虚函数:不希望派生类重新定义;
- 虚函数:有默认的定义,希望派生类重新定义;
- 纯虚函数;没有默认的定义,派生类一定要重新定义。
3)Template Method设计模式
注意点:
a、这是一种Template Mothod的设计模式,适用于有通用部分的函数和具体特殊的实现函数,这样通用部分的函数代码在框架中实现,具体特殊函数代码用继承虚函数实现;
4)继承与复合关系的构造与析构
注意点:
a、构造函数由内而外,即Derived的构造函数首先调用Base的默认构造函数,然后调用Component的默认构造函数,最后次执行自己;
b、析构函数由外而内,即Derived的析构函数首先执行自己,然后调用Component的析构函数,最后调用Base的析构函数。
5)委托与继承的设计模式
关系:
注意点:
a、这是一种Observer的设计模式,适用于如有一份文件,多个窗口查看或者一份数据,有多种视图显示;;
b、示例中Subject是数据类,Observer是显示类,可以被多个observer继承实现不同方式的查看。
5、委托的其它相关设计模式
1)Composite
注意点:
a、这是一种Composite的设计模式,要使Composite类中容器能容纳左边和右边的数据,所以设计一个Component的父类;
b、容器中只能放指针对象,因为指针的大小相同;
2)Prototype(原型)
注意点:
a、这是Prototype的设计模式,主要适用于现在创建未来的class对象,因不清楚未来类的名字;
b、未来对象是通过原型来创建的(必须运用事先搭好的框架),首先创建静态的对象,然后调用默认构造函数来通过原型创建对象。
c、类中的静态变量要在类外部定义。