设计模式(笔记)概述
参考自李建中视频
解决类与相互通信的对象之间的组织关系,包括角色,职责,协作几个方面。
应对变化,提高复用
面向对象设计模式是独立于编程语言的。
不像算法技巧,可以照搬照用,是一些经验性的认识。首先我们要先了解什么是面向对象。
1. 封装:隐藏内部实现,隔离内部变化,外部接口是稳定的,但是内部的实现可以随需求变化而变化。
2. 继承:复用现有代码(主要的一个目的)
3. 多态:改写对象行为
但是这三大机制是实现层面的,是我们在进行面向对象编程时候的实现方法。这三大机制既可以做出好的设计也可以做出坏的设计。不是说使用了面向对象的语言就是面向对象设计开发了。我们不能仅仅依赖编程语言的面向对象机制来做面向对象开发。
面向对象原则和模式会告诉我们什么样的设计才是面向对象的。
从宏观来面向对象更适应软件的变化。从微观来看,面向对象更强调各个类的责任。
对象是什么,
概念层:对象是拥有责任的抽象。
规格层(从外部来看):对象是一些列可以被其他对象使用的公共接口。
语言实现层:对象封装了代码和数据。
1. 针对接口编程:客户(使用你的对象的类)使用的都是接口,在使用这个对象的时候只需要知道这个对象的接口,不需要知道他得特定类型。
2. 优先使用对象组合,而不是类继承:类是白箱复用,破坏了封装,只要继承就拥有了父类的protected的属性,子类和父类的耦合度非常高。而对象组合则只要求被组合的对象具有良好的接口,耦合度低。需要区分is a和has a 的区别。非常强的is a的关系才用继承。
3. 封装变化点:使用封装来创建对象之间的分界层,让设计者可以再分阶层的一侧进行修改,而不会对另外一侧产生影响,从而实现松耦合。我们以前理解可能只是信息隐藏,但是特别重点的是变化点封装起来。
4. 使用重构得到模式:一套软件不可能直接就能先把设计完全做好。不可能一步到位。敏捷软件开发提倡使用重构得到模式。有的地方根本就不是变化点,可以就不用设计模式,不必要生搬硬套的使用设计模式。每个编程的人员都是设计人员,不要把自己和设计人员隔离开。代码在开发过程中不断的重构来得到最好的设计。
更多的设计原则:
1. 单一职责原则:一个类应该只有一个引起变化的原因。
2. 开放封闭原则:可扩展,但是不可修改。(对扩展开放,对更改封闭)
3. Liskov替换原则:子类必须能够替换他的基类。用is a来判断,有的时候你觉得是一个他的子类,但是实际上不是。
4. 依赖倒置原则:
高层模块不应该依赖于低层模块,二者都应该依赖于抽象。常见问题就是一个类去调用一个类的时候,用了很多的if else来执行不同对象的行为。这个时候应该使用接口。
抽象不应该依赖于实现细节,实现细节应该依赖于抽象。
5. 接口隔离原则:不应该强迫客户程序依赖于他们不用的方法。