zoukankan      html  css  js  c++  java
  • C++面向对象高级开发

    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: #
  • 相关阅读:
    认识“委托”
    程序员的修炼之道:从小工到专家(一)
    知识的使用 与 知识的内化
    VB.Net中 Module 的前世今生
    memcached
    C#知识
    Android之垂直显示TextView
    Android开发之各个语言
    Android之hint提示字体大小修改,显示完全
    Android 之计算控件颜色透明度
  • 原文地址:https://www.cnblogs.com/gdut-gordon/p/12174984.html
Copyright © 2011-2022 走看看