低耦合
开闭原则(隔离变化)
软件实体(模块、类、函数等等)应该对扩展是开放的,对修改是关闭的。
实现开闭原则的关键是抽象。当一个模块依赖的是一个抽象接口的时候,就可以随意对这个抽象接口进行扩展,这个时候,不需要对现有代码进行任何修改,利用接口的多态性,通过增加一个新实现该接口的实现类,就能完成需求变更。不同场景进行扩展的方式是不同的,这时候就会产生不同的设计模式,大部分的设计模式都是用来解决扩展的灵活性问题的。
策略模式
定义业务上下文与策略接口,再通过不同策略实现来实现开闭
适配器模式
当接口实现中存在分支判断(if/else)时,可通过定义不同的适配器来替代if/else实现开闭
观察者模式
当一个行为对应多个策略时,可通过添加多个监听者实现开闭
模板方法模式
当一类行为表现出相同特征时,可抽象出这个特征,创建一个父类,父类中用抽象方法定义计算的骨架和过程,而抽象方法的实现则留在子类中。
依赖倒置(依赖抽象)
高层模块不应该依赖低层模块,二者都应该依赖抽象。
高层和低层都依赖接口
抽象不应该依赖具体实现,具体实现应该依赖抽象
高层依赖抽象,具体也依赖抽象,高层不应该依赖具体,所以抽象的所有权应该属于高层,如spring框架,框架内定义好抽象接口,由我们引入框架依赖,并实现对应抽象,来获得框架提供的某些能力,框架是高层,我们是低层,通过抽象来交互,抽象放在高层
依赖倒置的关键是接口所有权的倒置:抽象不应该依赖具体实现,具体实现应该依赖抽象
依赖倒置原则最典型的使用场景就是框架的设计。框架提供框架核心功能,比如 HTTP 处理,MVC 等,并提供一组接口规范,应用程序只需要遵循接口规范编程,就可以被框架调用。程序使用框架的功能,但是不调用框架的代码,而是实现框架的接口,被框架调用,从而框架有更高的可复用性,被应用于各种软件开发中。
里氏替换(组合优于继承)<br>
子类型必须能够替换掉它们的基类型
语法上,任何类都可以被继承。但是一个继承是否合理,从继承关系本身是看不出来的,需要把继承放在应用场景的上下文中去判断,使用基类的地方,是否可以用子类代替
原则:子类不能比父类更严格
接口隔离(接口不要暴露多余的方法)
不应该强迫用户依赖他们不需要的方法。
通过使用接口隔离原则,我们可以将一个实现类的不同方法包装在不同的接口中对外暴露。应用程序只需要依赖它们需要的方法,而不会看到不需要的方法。
迭代器模式:对外暴露迭代器接口,应用程序只需要调用迭代器就能实现遍历,而无需关心具体的数据结构
高内聚
单一职责(类拆分,服务拆分,代码写在合适的位置)
一个类,应该只有一个引起它变化的原因。其他几项原则和大部分设计模式都是指导低耦合软件的设计,而单一原则则指导高内聚的软件设计
组合模式
是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
面向对象编程的精髓
继承,封装,多态
面对对象编程的精髓是多态
但是就算知道了面向对象编程的多态特性,也很难利用好多态的特性,开发出强大的面向对象程序。到底如何利用好多态特性呢?人们通过不断的编程实践,总结了一系列的设计原则和设计模式。
设计原则是指导思想,设计模式是具体的方法,是可重复的解决方案
设计模式的精髓就是对多态的灵活应用。
多态的迷人之处就在于,你单独看类的代码的时候,这些代码似乎平淡无奇,但是一旦运行起来,就会表现出纷繁复杂的特性。所以多态有时候也会带来一些代码阅读方面的困扰,让面向对象编程的新手望而却步,这也正是设计模式的作用,这时候你仅仅通过类的名字,比如 Observer、Adapter,你就能知道设计者在使用什么模式,从而更快速理解代码。
装饰器模式:定义一个装饰器接口,然后多个类实现这个接口,装饰模式最大的特点是,通过类的构造函数传入一个同类对象,也就是每个类实现的接口和构造函数传入的对象实现的是同一个接口,通过不通的构造顺序组合实现各种不同装饰的效果
框架中的设计模式
<b>框架是对某一类架构方案可复用的设计与实现</b>。框架通常<b>规定了一个软件的主体结构和规范</b>,<b>可以支撑起软件的整体或者局部的架构形式</b>,不能起到规范和架构作用的只能称为工具
tomcat,springMvc使用策略模式,策略接口是servlet,策略则用应用程序自己提供,controller是策略,供应用程序实现,策略嵌套策略
junit使用模板模式规范调用顺序,和组合模式组合测试套件,可以树形调用