设计模式——面向对象

Posted by Zreal on November 21, 2018

设计模式——面向对象程序设计

面向对象:

面向对象的模型是为了理解和分析目的而建立的抽象

好处:

  • 省略没必要的细节
  • 减少复杂度

主程序和子程序之间:

  • 基于定义-使用关系的等级分解
  • 直接基于编程语言的单线程控制
  • 子程序通常聚合到模块中,使子程序的结构不明显
  • 子程序的正确性通常取决于他调用的子程序的正确性,程序的正确性按层次推理

存在问题:

  • 非必要的结构和信息的暴露:

    • 全局变量可能以一种无法预料的危险的方式被使用

    • 经典编程语言通常创造一些共享(例如 块结构,全局变量)
    • 非定域性:使用方式依赖于实现方式
  • 波及效应: 一处修改影响其他模块

  • 对于一处的行为会关联到很多代码,很难找出被影响波及的代码

面向对象基础内容:

对象:具有属性,提供操作的实体

  • 数据被量化到离散的,可区分的实体
  • 两个属性完全相同的对象,也是可区分的
  • 每一个对象具有唯一的对象标识符,他是可以被唯一引用的

类:对于对象的共性描述

  • 具有相同数据结构和行为的对象被归为一类
  • 一个抽象,描述对于应用程序重要的属性,忽略其他的属性

子类:比父类增加了其他属性

​ 比父类的限制更多

实例:类的对象

操作:对象实行或受限于的一个行为或者变换

方法:操作的具体实现

消息:过程调用,执行方法的请求

抽象类:一个没有具体实例的类,但是他的子类有实例

抽象操作:子类必须实现的操作

面向对象高级特性:
  • 封装(信息隐藏)
  • 继承 (复用定义,数据和功能)
  • 多态性
  • 高度聚合

继承关系

  • 本质上是类的精化
  • 子类包含父类的所有属性
  • 子类只能增加行为
  • 多层具有向上的传递性
  • 子类可以复用父类的方法

多态性

  • 同样的操作在不同类中实现可能不同
  • 多带行操作可以有多个不同的实现方法

面向对象程序的多态性表现在:自动挑选正确的方法去实现一个操作基于 1. 操作的名称 2. 正在操作的对象的类

聚合(Aggregation)

  • 部分整体或者部分关系
  • 一个具有多个部件的程序集对应多种聚合关系
  • 聚合也可以说是一种特殊的关联

关联和聚合(Link & Aggregation)

img

左边聚合,右边是关联

  • 聚合可以说是一种特殊的关联
  • 部分-整体的关系是聚合,相互独立的关系是association

聚合和继承

  • 聚合 A是B的一部分 继承 A是B的一种

  • 聚合:和实例相关 继承:和类相关

  • 聚合:and-relationship 继承:or-relationship

    img

聚合的种类

  • Fixed aggregate
  • Variable aggregate
  • Recursive aggregate 递归聚合

Fixed aggregation

子部件的数量和类型已经预定义好的

Variable aggregation

部件数量可能不同,但是数量有限

Recursive aggregation

包含一个相同类型的实例的聚合,数量是没有限制的

面向对象方法的问题

  • 纯OO设计导致了拥有许多对象的大的扁平化系统,这会导致:
    • 同样的老的问题会重复出现
    • 成百上千的模板,难以寻找信息
    • 需要一种方法去加强结构
  • 大量对象需要一种额外的结构
  • 结构选项:
    • 层级结构 (这不一定是对象)
    • 补充索引
    • 分层分解:大对象和小对象
  • 需要管理许多关联:
    • ​ 单一接口被限制,过于笨重
    • 一些语言和系统允许多种接口
  • 一个行为往往是由多个对象形成的
    • 这使得整个系统很难去理解
    • 交互图被用在了设计之中