1. 开闭原则
    1. 概念
      1. 对代码的拓展开放,对代码的修改关闭
    2. 含义
      1. 当应用程序的需求出现变化的时候,不修改软件已经实现的代码,而是通过拓展模块的功能来满足需求。
    3. 优势
      1. 1. 只测试新增加的功能,原有代码仍可正常运行
      2. 2. 实现开闭原则需要降低代码的粒度,单个目标明确的代码很少被更改,提高复用程度。
    4. 实现例子
      1. 对于某个界面,可以定义一个抽象类,规定拥有特定的不变功能,和需要实现的个性化元素。然后让各种主题都实现抽象类,继承了特定不变的功能,重写了需要实现的个性化元素。实现一个新的主题,没有修改原有的代码,而是通过拓展主题类实现新的主题。
  2. 替换原则
    1. 概念
      1. 继承必须保证父类所拥有的性质在子类中仍然成立
    2. 含义
      1. 在确定继承关系的时候,需要保证子类的所有方法都符合父类的要求,尽量不要重写父类已经实现的方法,避免多态玩脱了。
    3. 优势
      1. 保证继承关系的正确性,防止出现异常
    4. 实现例子
      1. 对于父类鸟,拥有方法 fly(),那么企鹅因为不会飞,所以需要重写 fly() ,但是就不能保证父类鸟的 fly() 的性值在子类企鹅中仍然成立,所以不符合替换原则,应该给企鹅找一个更适合它的父类,比如动物。
  3. 依赖倒置原则
    1. 概念
      1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
    2. 含义
      1. 要面向接口编程,不要面向实现编程,通过接口来制定好规范和契约,细节交给实现类来完成。
    3. 优势
      1. 只需要持有固定不变的接口就可以编写代码,将不变的地方(对这一类东西的处理)和变得地方(类本身的各种各样)分离开来。
    4. 做法
      1. 定义一个此类都会必有的功能,抽象成接口,然后操作这个接口,这样无论接口实现类如何改变,操作的接口代码都不用变。
  4. 单一职责原则
    1. 控制类的粒度大小,将对象解耦,提高内聚性
      1. 粒度
        1. 就是类中的实现内容,尽量保证一个方法实现一个内容,一个类实现一类内容。
      2. 耦合性
        1. 一个程序中,小模块与小模块之间的联系复杂度,之间联系越复杂,耦合度越高,牵一发而动全身。所以要提高模块的独立性,来降低模块之间的耦合性。
      3. 内聚性
        1. 指的是模块内部之间的元素之间的联系,这些元素之间的联系应该内聚到本模块之内,并降低和外部模块元素的联系,实现元素联系的内聚(内聚本模块中)
      4. 大概类似与手机封装的元器件
  5. 接口隔离原则
    1. 含义
      1. 为各个类建立它们需要的的专用接口
    2. 做法
      1. 将一个大的接口拆分为多个粒度更小的接口,保证一个接口只会服务一种业务逻辑或者一个子模块。
      2. 让接口用最少的方法完成最多的事情
  6. 最少知识原则
    1. 含义
      1. 只与本类自身的关系最近的类进行交互,不跨类操作
        1. 比如年级主任想要获取某班的某个学生的家庭情况,不应该直接去找学生进行交互,而是应该通过交互自己管辖的班主任,让班主任去和学生交互获取信息,然后返还给自己。
    2. 特点
      1. 只依赖应该依赖的对象
        1. 年级主任应该只依赖与班主任,而不能依赖于学生、家长。
      2. 只暴漏应该暴漏的方法
        1. 班主任应该只暴漏给年级主任执行班级管理的方法,而对于其他方法如生活接口方法不应该暴漏给它。
  7. 合成复用原则
    1. 含义
      1. 应该尽量使用组合 (has) 关系来实现,其次考虑及继承(is)关系。
    2. 做法
      1. 别轻易的通过继承父类来复用父类的代码,而更多的考虑组合父类的来复用代码。
    3. 例子
      1. 一个汽车类应该组合:红色汽车,电动汽车等类的共功能。而不是同时继承红色汽车,电动汽车来复用它们的功能。