零、概述
常用的设计模式一共有23种,可以从两个不同维度来分类。
- 根据目的划分:创建型模式、结构型模式、行为型模式
-
根据作用范围来划分:类模式、对象模式
设计模式有七大原则
- 单一职责原则 SRP,即一个类只负责一项职责
- 开放-关闭原则 OCP,也称开闭原则,表示软件实体 (类、模块、函数等等) 应该是可以被扩展的,但是不可被修改。(Open for extension, close for modification)。
- 里氏替换原则 LSP,当使用继承时候,类 B 继承类 A 时,除添加新的方法完成新增功能,尽量不要修改父类方法预期的行为。父类中凡是已经实现好的方法(相对于抽象方法而言),实际上是在设定一系列的规范和契约,虽然它不强制要求所有的子类必须遵从这些契约,但是如果子类对这些非抽象方法任意修改,就会对整个继承体系造成破坏。
- 依赖倒转原则 DIP,抽象不应该依赖于细节,细节应该依赖于抽象,核心思想就是面向接口编程。
- 接口隔离原则 ISP,客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
- 迪米特法则 LOD,又称为最少知道原则,它表示一个对象应该对其它对象保持最少的了解。
- 组合/聚合复用原则 CRP,实际开发设计中,尽量使用组合/聚合,不要使用类继承。
一、原型模式
原型模式是从原型实例复制克隆出新实例,而绝不是从类去实例化,这个过程的区别一定要搞清楚。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。
设计模式是什么鬼(原型)
二、单例模式
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。
设计模式是什么鬼(单例)
三、工厂方法
客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。
设计模式是什么鬼(工厂方法)
四、抽象工厂
在工厂方法的基础上演变而来,核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
设计模式是什么鬼(抽象工厂)
五、建造者
将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。
设计模式是什么鬼(建造者)
六、代理
代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。
很多框架中大量应用到了动态代理模式,比如Spring的面向切面AOP,我们只需要定义好一个切面类@Aspect,声明其切入点@Pointcut(被代理的哪些对象的哪些方法,也就是这里的猫和交换机的access以及accessFile),以及被切入的代码块(要增加上去的逻辑,比如这里的过滤功能代码,可分为前置执行@Before,后置执行@After,以及异常处理@AfterThrowing等),于是框架自动帮我们生成代理并切入目标执行。
设计模式是什么鬼(代理)
七、适配器
把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。
设计模式是什么鬼(适配器)
八、桥接
将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
设计模式是什么鬼(桥接)
九、装饰
装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。
设计模式是什么鬼(装饰)
十、外观
外观模式又叫门面模式。外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
设计模式是什么鬼(门面)
十一、享元
享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。
设计模式是什么鬼(享元)
十二、组合
合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。
设计模式是什么鬼(组合)
好了,这篇文章到此告一段落,剩下的十一种设计模式将会在《设计模式(二)》种做简要说明。