【设计模式学习笔记C++】【一】设计模式的原则

目录

  • 1 什么是面向对象编程
  • 2 UML类图
    • 2.1 类
    • 2.2 类与类之间的关系
    • 2.3 关联关系、聚合关系、组合关系之间的区别
  • 3 设计模式三原则
    • 3.1 单一职责原则
    • 3.2 开放封闭原则
    • 3.3 依赖倒转原则
  • 4 参考

1 什么是面向对象编程

来自维基百科的解释

面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、特性、代码与方法。对象则指的是类(class)的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象

来自百度百科的解释

面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

总结起来:面向对象就是程序是由一个个对象组成的,每一个对象可以接收数据,处理数据,以及将自己的数据传递给其他对象。合适的对象的抽象可以有效提高程序的灵活性和可维护性。

2 UML类图

2.1 类

面向对象设计主要使用的就是UML类图,类图用于描述系统中所包含的类以及他们之间的相互关系,帮助人们理解系统,他是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。

类(class /struct)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。在系统中,每个类都具有一定的职责,职责指的是类要完成什么样子的功能,要承担什么样子的义务。一个类可以有多种职责,但是设计得好的类一般只有一种职责。

【设计模式学习笔记C++】【一】设计模式的原则_第1张图片
一个类对应分为上中下三部分:上层是类名,中间层是属性(类的成员变量),下层是方法(类的成员函数)。

  • 可见性:+ 表示 public、# 表示 protected、- 表示 private、__(下划线) 表示 static
  • 属性的表示方式:【可见性】【属性名称】:【类型】= {缺省值,可选}
  • 方法的表示方式:【可见性】【方法名称】(【参数名:参数类型,……】):【返回值类型】

2.2 类与类之间的关系

  1. 继承关系:也叫作泛化(Generalization),用于描述父子类之间的关系,父类又称为基类或者超类,子类又称作派生类。在 UML 中,泛化关系用带空心三角形的实线来表示。
  2. 关联关系:它是一种结构化的关系,表示一个对象与另一个对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学生等。在 UML 类图中,用(带接头或不带箭头的)实线连接有关联关系的类。在 C++ 中这种关联关系在类中是这样体现的,通常将一个类的对象作为另一个类的成员变量。一般有单向关联关系,双向关联关系,以及自关联关系。
  3. 聚合关系:表示整体与部分的关系。在聚合关系中,成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在。在 UML 中,聚合关系用带空心菱形的直线表示。有空心菱形的一端指向整体对象,另一端连接局部对象。
  4. 组合关系:表示的是一种整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有同生共死的关系。在 UML 中组合关系用带实心菱形的直线表示。实心菱形指向整体类,另一端连接部分类。
  5. 依赖关系:是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法使用另一个类的对象作为参数。在 UML 中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

依赖关系通常通过三种方式来实现:

  1. 将一个类的对象作为另一个类中方法的参数
  2. 在一个类的方法中将另一个类的对象作为其对象的局部变量
  3. 在一个类的方法中调用另一个类的静态方法

2.3 关联关系、聚合关系、组合关系之间的区别

  1. 关联和聚合的区别主要在于语义上:关联的两个对象之间一般是平等的,聚合则一般是不平等的。
  2. 聚合和组合的区别则在语义和实现上都有差别:
    2.1. 组合的两个对象之间生命周期有很大的关联,被组合的对象在组合对象创建的同时或者创建之后创建在组合对象销毁之前销毁,聚合则无需考虑这些事情。
    2.2. 一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,聚合则不一样,被聚合的对象可以属于多个聚合对象。

类之间的关系强弱顺序是这样的:继承(泛化) > 组合 > 聚合 > 关联 > 依赖。

3 设计模式三原则

为了保证程序的可扩展性,可维护性和可读性,设计模式一般都遵循如下原则:

3.1 单一职责原则

我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。这样才可以更好的复用,程序才可以更加灵活,并且好维护。

3.2 开放封闭原则

开放 – 封闭原则说的是软件实体(类、模块、函数等)可以扩展,但是不可以修改。也就是说对于扩展是开放的,对于修改是封闭的。深有体会,如果一个类似不仅被修改或者添加新功能,而且是两个甚至多个人在修改,简直就是灾难。

3.3 依赖倒转原则

关于依赖倒转原则,有两条描述:

  1. 高层模块不应该直接依赖低层模块,两个都应该依赖抽象。
  2. 抽象不应该依赖细节,细节应该依赖抽象。

先用人话解释一下这两句话中的一些抽象概念:

  • 高层模块:可以理解为上层应用,就是业务层的实现
  • 低层模块:可以理解为底层接口,比如封装好的 API、动态库等
  • 抽象:指的就是抽象类或者接口,在 C++ 中没有接口,只有抽象类

其实就是高层模块和底层模块之间夹一个抽象类,这样底层的修改,可以让高层不可见。在抽象的时候要从更高层次去看,相当于声明的接口要更加通用。在子类中需要实现所有的接口,不应有遗漏。

4 参考

  1. UML类图

你可能感兴趣的:(c/c++,设计模式,学习,c++)