cv_gordon

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

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图示:

  1. 静态:_
  2. private: -
  3. public: +
  4. protected: #
posted on 2020-01-10 10:42  cv_gordon  阅读(236)  评论(0编辑  收藏  举报