设计模式总结
分析对象,分析业务中各对象结构,行为。
设计原则
- 单一职责原则 职责单一
- 开放封闭原则 扩展开放,修改关闭
- 里氏替换原则 子类可替换父类的实例
- 接口隔离原则 接口隔离,不要将所有方法都扔到一个接口,使用多个专门功能的接口,而不是单一总接口
- 依赖倒转原则 依赖抽象,不要依赖具体
- 合成复用原则
简言之:复用时要尽量使用组合/聚合关系(关联关系),少用继承
给一个类添加功能(扩展):关联(组合,聚合),继承
has-a 使用关联 (推荐使用)【桥接模式】,is-a 使用继承(减少使用)
如果类之间的继承结构稳定(不会轻易改变),继承层次比较浅(比如,最多有两层继承关系),继承关系不复杂,我们就可以大胆地使用继承。反之,系统越不稳定,继承层次很深,继承关系复杂,我们就尽量使用组合来替代继承。 - 迪米特法则,最少知道原则
尽可能少的和其他实体相互作用,对其他类尽可能少得知道,减少依赖。
不希望类之间建立联系。如果需要建立联系,希望通过它的友元类(中间件)转达。【终结者模式】
简单定义:只与直接的朋友通信
直接朋友:每个对象都会和其他对象有耦合关系,就说他们有朋友关系。耦合方式有很多,依赖,关联,组合,聚合等。其中,我们称出现在成员变量,方法参数,方法返回值中的类为直接朋友,而出现在局部变量中的类则是不直接的朋友。
也就是说陌生类最好不要作为局部变量的形式出现在类的内部。
基于接口编程而非实现
从本质上来看,“接口”就是一组“协议”或者“约定”,是功能提供者提供给使用者的一个“功能列表”。
“接口”在不同的应用场景下会有不同的解读,比如服务端与客户端之间的“接口”,类库提供的“接口”,甚至是一组通信的协议都可以叫作“接口”。刚刚对“接口”的理解,都比较偏上层、偏抽象,与实际的写代码离得有点远。
如果落实到具体的编码,“基于接口而非实现编程”这条原则中的“接口”,可以理解为编程语言中的接口或者抽象类。
这条原则能非常有效地提高代码质量,之所以这么说,那是因为,应用这条原则,可以将接口和实现相分离,封装不稳定的实现,暴露稳定的接口。上游系统面向接口而非实现编程,不依赖不稳定的实现细节,这样当实现发生变化的时候,上游系统的代码基本上不需要做改动,以此来降低耦合性,提高扩展性。
这条原则的另一个表述方式,是“基于抽象而非实现编程”。后者的表述方式其实更能体现这条原则的设计初衷。在软件开发中,最大的挑战之一就是需求的不断变化,这也是考验代码设计好坏的一个标准。越抽象、越顶层、越脱离具体某一实现的设计,越能提高代码的灵活性,越能应对未来的需求变化。好的代码设计,不仅能应对当下的需求,而且在将来需求发生变化的时候,仍然能够在不破坏原有代码设计的情况下灵活应对。而抽象就是提高代码扩展性、灵活性、可维护性最有效的手段之一
创建型模式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
创建型模式主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。
单例模式用来创建全局唯一的对象。
工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
建造者模式是用来创建复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象。
原型模式针对创建成本比较大的对象,利用对已有对象进行复制的方式进行创建,以达到节省创建时间的目的。
结构型模式(结构型模式主要总结了一些类或对象组合在一起的经典结构)
行为型模式
观察者模式 观察者模式,它将观察者和被观察者代码解耦
设计模式要干的事情就是解耦
创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为型模式是将不同的行为代码解耦。
借助设计模式,我们利用更好的代码结构,将一大坨代码拆分成职责更单一的小类,让其满足开闭原则、高内聚低耦合等特性,以此来控制和应对代码的复杂性,提高代码的可扩展性。
19.理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?
21.DRY 原则
23.loading...
设计原则和思想比设计模式更加普适和重要。掌握了代码的设计原则和思想,我们能更清楚的了解,为什么要用某种设计模式,就能更恰到好处地应用设计模式。