Object Oriented Programming,Object Oriented Design
面向对象的程序设计中,类之间有三种关系:
- Inheritance
- Composition
- Delegation
1. Composition,表示 has-a
容器 queue 中拥有零部件 deque。deque 是双端队列,queue 队列。deque 完全满足 queue 所有功能需求。
queue 和 deque 的关系体现了一种设计模式, Adapter。
从内存的角度来查看 Composition。
Composition 关系下的构造和析构
构造过程中,编译器会默认调用 Component 的默认构造函数。若想调用其他构造函数,则需要自己写。
2. Delegation (委托). Composition by reference
String 中有一个 StringRep 类型的指针,String 的所有操作都有 StringRep 来实现。
3. Inheritance,表示 is-a
从内存角度看继承。
继承关系下的构造和析构。
4. Inheritance with virtual function
函数的继承不能从内存的角度进行理解,应该从继承权的角度进行理解。
纯虚函数可以定义成2种形式 —— “ = 0”,“{ } 函数体为空”。
举个例子理解虚函数的使用
PPT打开文档的功能是所有软件皆备的功能,分为3个步骤,check file name,search file,open file。对于不同软件,前两个步骤是一样的,对于不同的软件,open file打开的文档不一样。因此,可以把open file写成虚函数。
Template Method 是一种设计模式。意思是基类(CDocument)中的虚函数提供统一的接口,然后在子类(CMyDoc)中,对虚函数进行派生。
5. Inheritance + Composition 关系下的构造和析构
6. Inheritance(继承) + Delegation(委托)
这里共介绍 3 种设计模式,它们都由 Inheritance+Delegation 的方法进行实现。
6.1 设计模式 —— Observer
如下UI功能,左边,改变四边形点的坐标,4个界面都会同步更新。
右边,更改数值,2个柱状图都会同步更新。
源码中,Subject 中有个 vector<Observer*> 类型的数组,可存放多个可视化对象。然后通过 notify() 通知所有可视化对象进行更新。
6.2 设计模式 —— Composite
设计一个文件系统。
Primitive 表示文件,继承自 Component 。
Composite 表示一个容器,可以存放文件和文件夹(容器),因此其中有个 vector<Component*> 存放指向父类 Component 的指针。
6.3 设计模式 —— Prototype
当前设计一个基类,作为框架。未来将从该基类派生出多个子类。然而,在当前无法得知派生类的名称,那么如何让基类得知子类的名称呢?
Prototype 是一个解决上述问题的经典解法。
Image 类派生出多个子类,同时对自身产生委托。然后即可通过数组 _prototype 访问到子类的对象。
UML图示:
- 静态:_
- private: -
- public: +
- protected: #