闲来无事,把平时零散在记忆里的设计模式整理一下,梳理成章,遂成此文。
首先是思维导图:因为我懒,所以尚未完善
其中有摘抄也有注释,大概类似读书笔记一样。
闲言少叙,开始正文
聊到设计模式就不得不谈六大设计原则,设计模式都是从设计原则升华而来。所以先了解设计原则是很有必要的
一、单一职责原则
不要存在多于一个导致类变更的原因。即一个类只负责一项职责。
遵循单一职责原的优点有:1、可以降低类的复杂度,一个类只负责一项职责,其逻辑要比负责多项职责简单的多;
2、提高类的可读性,提高系统的可维护性;
3、变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
当然,过度设计要不得,就像数据库第二范式一样;在实际项目中,过度使用单一职责原则会导致类被拆分的过细,不论其 他人,就算自己再翻阅以前的代码都会懵逼,我以前究竟干了些什么?适当的冗余是必须的
二、里氏替代原则
最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。
在能使用父类的地方,替换为其子类后,行为不会出现变化。即子类尽量不要重载或重写父类的方法,如果确实需要,则必须保证行为一致。不要从可实例化的父类中继承,而是要使用基于抽象类和接口的继承。
三、依赖倒置原则
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在java中,抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。依赖倒置原则的核心思想是面向接口编程。
四、接口隔离原则
建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。
1、接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不争的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
2、为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
3、提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
五、迪米特法则
一个对象应该对其他对象保持最少的了解。
类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
迪米特法则还有一个更简单的定义:只与直接的朋友通信。
首先来解释一下什么是直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。其中,出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。
六、开闭原则
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。
如果子类遵循开闭原则,顺其自然就会满足里氏替代原则
说完设计原则,接下来则会说到设计模式。设计模式依其特性、行为分为三类:创建型模式,结构型模式,行为型模式
一、创建型模式
对象的创建无疑是Java中资源消耗较高的操作之一,如何优雅的创建对象,是我们一直研究的对象。
创建型模式一共有6个:
抽象工厂模式(Abstract Factory)
创建者模式(Builder)
原型模式(Prototype)
单例模式(Singleton)
其中简单工厂模式是对工厂模式的简化,并不单独列为一类
二、结构型模式
结构型模式研究如何设计对象的结构、继承等,影响后续程序的可维护性、健壮性等。代理模式是最常用的结构模式。
外观模式/门面模式(Facade门面模式)
适配器模式(Adapter)
代理模式(Proxy)
装饰模式(Decorator)
桥梁模式/桥接模式(Bridge)
组合模式(Composite)
享元模式(Flyweight)
三、行为型模式
平时编码接触的最少的一类模式,也是最多的模式
模板方法模式(Template Method)
观察者模式(Observer)
状态模式(State)
策略模式(Strategy)
职责链模式(Chain of Responsibility)
命令模式(Command)
访问者模式(Visitor)
调停者模式(Mediator)
备忘录模式(Memento)
迭代器模式(Iterator)
解释器模式(Interpreter)