面向对象三大基本特征是继承、封装和多态,其思想特点是高内聚,低耦合;多聚合,少继承。设计模式的原则很好的体现了面向对象的思想,被广泛的运用的设计模式的实践当中。
(一)
| 开放-封闭OCP (Open-Closed Principle) | 依赖倒转DIP (Dependency Inversion Principle) | 里氏代换LSP (Liskov Substitution Principle) |
主要内容 | 软件实体(类、模块、函数等等)应该可以扩展,但是不可修改 | 1.高层模块不应该依 赖低层模块。两个都应该依赖抽象 2.抽象不应该依赖细节。细节应该依赖抽象 | 子类型必须能够替换掉它们的父类型 |
概括 | 可扩展,不可修改 | 依赖抽象(接口或抽象类) | 子类继承父类,子类以父类身份出现 |
分析 | 1.面对需求,对程序的改动通过增加新代码,而不是更改现有代码 2.预先猜测变化,构造抽象隔离这些变化 | 1.与OCP原则相辅相成 2.针对接口编程,不针对实现编程 3.程序中的所有依赖关系终止于抽象类或者接口 | 1.前提是子类和父类的关系 1.在软件中,父类都替换成它的子类,程序的行为没有变化 |
举例 | 期末备考时,复习计划不应该改变,我们可以在复习之余,增加一些其他学习内容 | 电脑中的cpu、内存、硬盘依赖接口,不依赖主板 | 猫捉老鼠,猫可以是黑猫、白猫,也可以是小花猫 |
(二)
| 单一职责SRP (Single Responsibility Principle) | 迪米特LoD (Law of Demeter) | 合成/聚合复用CRP (Composite Reuse Principle) | 接口隔离ISP(最小知识) (Interface Segregation Principle) |
主要内容 | 就一个类而言,应该仅有一个引起它变化的原因 | 如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用。如果一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用 | 尽量使用合成/聚合,尽量不要使用类继承 | 使用多个专门的接口来取代一个统一的接口 |
概括 | 功能单一 | 第三者调用 | 复用 | 专门化 |
分析 | 1.一个类的职责过多,相当于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 2.类的职责:数据职责(属性),行为职责(方法) | 1.在类的结构上,每一类都应当尽量降低成员的访问权限 2.强调了类之间的松耦合,耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及 | 1.合成表示A是B的一部分,A不能脱离B而存在,是整体与部分的关系 2.聚合表示A包含B,B是A的组成部分,B可以脱离A而存在 | 1.使用多个专门的接口,而不使用单一的总接口。一个接口只代表一个角色,每个角色都有特定的接口;接口仅仅提供客户端需要的行为,将不需要的行为隐藏起来。 2.使用ISP原则拆分接口时,必须满足SRP原则。 3.可以采用定制服务的方式,为不同的客户端提供宽窄不同的接口。 |
举例 | 电脑内存出问题,更换内存条; cpu出问题,更换cpu | 期末考试的时间安排:任课老师提供试题,教秘安排时间,学生在规定时间进行考试,任课老师与学生不必因为考试时间发生直接的关系 | 合成:翅膀和大雁 聚合:雁群和大雁 | 做加减乘除运算时,应有自单个的接口,加法执行加法接口,减法执行减法接口…而不是加法和减法都执行运算的接口 |