常用的设计模式
个人理解整理,欢迎批评指正
设计模式就是教你面向对象应该怎么玩,设计模式一般不会单独使用,多种设计模式组合使用。
所谓设计模式,就是遇到问题后的一种解决思路;将这些解决方法整合起来就形成了设计模式
设计模式讲究的是思想,有些设计模式实现上看可能类似,但是其表达的意思跟要解决的问题不一样
本文代码:https://github.com/shenwuwu/desigin
设计模式遵循的六大原则
- 单一职责SRP :针对一个类而言应该有且仅有一个原因引起类的变更;职责,是指类变化的原因,即实现高内聚低耦合,将不同的职责拆分出不同的类或方法。
- 里氏替换原则LSP:基础–所有引用基类的地方,必须都可以用子类替换;即在继承关系中,必须保证子类含有父类的所有行为(不能在子类覆盖父类的行为,去提示说子类没有这个功能),并且保证行为的一致性,这样可以保证父类被复用,子类可以扩展。
- 依赖倒置原则DIP:手段–面向抽象编程;即解决客户端与服务端的解耦,如果需求变更或扩展,服务端可以增加新的实现来完成;所谓倒置,1.正常情况下B要依赖于A,需要A先实现,B里才能放A的引用 2.面向接口编程,如果B要依赖于A,B中可以引用A的接口,而不需要A的实现,这个顺序的倒置。
- 接口隔离原则ISP:使用多个专门的接口比使用单一的总接口要好;即对客户端提供的接口,不要对其提供多余客户端不需要的功能。
- 迪米特法则LoD:实体之间尽量少的发生相互关系;主要还是为了解耦,可以通过友元类来完成关联。
- 开闭原则OCP:目标 对扩展开放, 对修改关闭;每次扩展时,不能修改原有逻辑,类似于jdk每次升级时,新增功能去替换原有功能时,使用@Deprecated将旧方法改成不建议使用的状态。
设计模式
- 创建型:主要用于创建符合需求的对象实例
- 工厂模式Factory:用一个对象去创建同一种类型的不同对象的实例
- 建造者模式Builder:保证对象内部建造的顺序
- 原型模式Prototype:复制、克隆
- 单例模式singleton:一个对象只能有一个实例
- 有限多例模式:一个对象只能有有限个数的实例
- 结构型:对象之间的组合结构
- 适配器模式Adapter:将一种类型(类型其实就是接口)的对象转换成另外一种类型的对象去使用【这个两种类型是同一类,但是结构不一样】
- 装饰器模式Decorate:同源(同一个father)的委派模式就是装饰器模式
- 代理模式Proxy:代替被代理的对象去做事(1. 对被代理限制 2. 对被代理静态扩展)
- 委派模式Delegate:分发的功能,交给其他的类去做拆分后的事;一个类A持有另一个类/接口B的对象,类A对外提供功能,实际调用B的方法
- 桥接模式Bridge:将两个抽象关联起来【不同类型】
- 组合模式Composite:树形结构
- 门面模式Facade:将流程化的事封装在一起形成一个方法,用这个方法实现整个流程
- 享元模式Flyweight:共享对象实例,不需要每次都创建(类似于单例、有限多例模式)
- 行为型
- 策略模式Strategy:过程可选,结果不变
- 解释器模式Interpreter:对已定义的内容进行解释(如:实现正则表达式的实现)
- 模板方法模式Template Method:流程固定,实现有差异
- 责任链模式Chain of Responsibility:存在层级关系,每一层有自己的责任任务,多层构成一个链式处理的行为
- 命令行模式Command:将指令或请求进行抽象,并分发该命令或请求给指定的执行人
- 迭代器模式Iterator:定制自己的迭代器,可以重写jdk的迭代器实现,像list,set里的迭代器都是重写的
- 调节者(中介者)模式Mediator:将两个本没有关系的类,关联起来;使得两个类之间有交互
- 备忘录模式Memento:用于备份可能需要还原的待备份对象的属性
- 观察者模式Observer:被观察者的动作触发观察者的动作
- 状态模式State:对状态进行抽象,通过状态决定动作
- 访问者模式Visitor:以访问者类(身份)对需要指定的对象类有不同的表现形式;不同身份的访问者针对同一对象的同一方法,也有不同的表现形式
设计模式之间的关系(图片来源于:《设计模式:可复用面向对象软件的基础》)
组合设计模式场景:
1.
spring中的设计模式:
###持续更新…