设计模式七大原则

单一职责原则:

  • 降低类的复杂度,一个类只负责一项职责
  • 提高类的可读性,可维护性
  • 降低变更风险
  • 除非逻辑足够简单,可以违反该原则

    接口隔离原则:

    如果一个类对另外一个类的依赖,则需要最小接口原则。将耦合的接口拆分为多个独立接口
    图解
    image.png
    符合原则的修正
    image.png

    依赖倒转原则

    高层模块不应该依赖底层模块,二者都应该依赖抽象
    抽象不应该依赖细节,细节应该依赖抽象
    依赖倒转的中心思想是面向接口编程
    使用接口或者抽象类的目的是制定好规范,不涉及任何具体操作,把展现细节的任务交给实现类去完成
    依赖传递的三种方式:接口传递,构造函数传递,set方式传递
    注意事项及细节:

  • 底层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性最好

  • 变量的声明类型尽量是抽象类或接口,变量引用和实际对象间,存在缓冲层,利于程序扩展和优化
  • 继承时遵循里氏替换原则

    里氏替换原则

    所有引用基类的地方必须可以透明的使用子类
    父类中凡是已经实现好的方法,是在设定规范和契约
    在子类中尽量不要重写父类的方法
    违反里氏替换原则后,通常的处理方法:

  • 提取出更基础的基类,父类和子类继承与该类。

  • 或者采用组合,依赖,聚合的方式

改进方案
image.png

开闭原则:最基础

拓展开放,对修改关闭。
当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化
image.png
空三角箭头:继承关系
修改方法:
shape作为抽象类,给出draw接口
rectangle和circle作为实现类,实现draw接口
使用方:GraphicEditor实现drawShape即可

迪米特法则

只与直接的朋友通信
朋友关系:A和B存在耦合关系,耦合包括:依赖,关联,组合,聚合等
直接的朋友定义:B作为A的成员变量,函数形参,函数返回值时,B是A的直接朋友。

合成复用原则

尽量使用合成/复合的方式,而不是继承

UML类图

image.png

依赖:

A使用B,任何使用方式都有依赖关系:成员变量,成员函数的形参及返回值,局部变量

关联:

一对一,一对多的关系,A拥有成员变量B,则A->B为单项一对一关系
image.png

泛化:继承

实现:

A实现某个接口,C++中子类实现纯虚父类

聚合:

A类中有B的成员变量,使用set/get方法,B可以与A分离
image.png

组合:

B用new的方式用到A,AB同生共死,耦合性大于聚合,A与B不可分开
image.png

设计模式

创建型模式:
结构型模式:
行为型模式:

单例模式

保证整个软件系统中,对某个类只能存在一个对象实例
八种实现方式:

饿汉式:

  1. 构造函数私有化,防止new
  2. 本类内部创建静态对象实例
  3. 对外提供公有的静态方法,返回实例对象