23种设计模式理解

一、设计模式概述

设计模式就是一种通过大量编程实践总结出来的模式规范,每种设计模式都对应了其特殊的应用场景。当然,设计模式只是一种简单抽象化出来的语义概念,不必执着于词语的片面含义,实际使用中往往是各种模式之间的交叉或复合使用。

二、23种设计模式理解

1. 单例模式
单例模式就是整个系统中,某个类只能有一个实例存在,并提供一个全局访问接口。
当系统中只需要一个实例对象的时候,如打印机实例,可以考虑使用单例模式;从而提高系统效率、节约系统资源、严格控制用户访问。

2. 工厂模式
工厂模式包含工厂方法模式和抽象工厂模式。
(1)工厂方法模式
在这里插入图片描述
工厂方法模式定义了一个创建对象的接口,由子类决定要实例化哪一个类,工厂方法使一个类的实例化推迟到子类。
当需要增加新的品类时,我们只需要增加品类对象和创建他的工厂类即可,不用修改原有模块。调用方只需要知道品类的具体工厂即可,无须关心生产过程。
但是随着品类的持续增加,系统的复杂度也将随之增加。

3. 抽象工厂模式
在这里插入图片描述
抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而无须指定他们的具体类。
抽象工厂多了一层抽象,减少了工厂的数量;不足在于难以扩展产品品类,当增加一个新的品类对象时,需要修改及其下所有的子类。

总结:
唯一工厂类,一个品类抽象类,工厂类的创建方法由入参判断并创建具体产品对象,适用简单工厂类。

多个工厂类,一个品类抽象类,利用多态创建不同的产品对象,避免了大量判断语句,适用简单工厂方法。

多个工厂类,多个品类抽象类,需要品类子类分组,同一个工厂实现类创建同组中的不同产品,减少工厂类数量。

4. 组合模式—树形结构
在这里插入图片描述
组合模式组合多个模块形成树形层次结构。他定义了如何将枝干和叶子进行递归组合,使得客户端在调用中无须区分,对他们进行一致处理。
实现组合模式的关键在于枝干和叶子要实现同一个接口,从而保证一致化处理。

5. 装饰模式(Decorator)
在这里插入图片描述
装饰者模式用来动态地将行为添加到对象上;在扩展功能上,装饰者模式比继承有更多的弹性;但装饰者模式也会产生很多细小对象,增加了系统的复杂度。
实现装饰者模式需要核心责任类和装饰类继承相同的类。

使用场景:
(1)需要扩展一个类功能时。
(2)核心类主体功能不变,只是需要局部改装时。

6. 门面模式(Facade)
在这里插入图片描述
门面模式也叫外观模式。该模式对外提供一个统一的接口,从而降低系统的耦合度,外部无需关心接口内部的实现细节,大大降低系统复杂度,提高了程序的可维护性。

不足:
(1)不能很好地限制客户端使用子系统类,很容易带来未知风险。
(2)增加新的子系统可能需要修改外观类或客户端代码,违背“开闭原则”。

7. 享元模式(Flyweight)

在这里插入图片描述
享元模式通过共享急速实现相同或相似对象重用的目的。
该模式要求能够共享的对象必须是细粒度对象。

享元模式使用了内部状态和外部状态,同时外部状态相对独立,不会影响到内部状态,所以享元模式能够使得对象在不同环境下被共享。

内部状态是指对象共享出来的信息,存储在享元对象内部,并且不会随着环境的改变而改变。
外部状态是指对象得以依赖的一个标记,是随环境变化而变化,不可共享的。

比如五子棋,棋子颜色就黑白两种状态,是对象的内部状态;方位坐标就是棋子的外部状态。

String类的设计也是享元模式;

8. 策略模式(Strategy)
在这里插入图片描述
策略模式定义了一组算法,将每个算法都封装起来,使他们之间可以相互转换。
context是上下文,用一个concreteStrategy来配置,维护一个对strategy对象的引用;strategy是抽象策略类,用于定义所有支持算法的公共接口;concrete是具体策略类,封装了具体的算法和行为,继承于strategy。

使用策略模式,客户端必须要先知道每个算法之间的区别,以及如何选用最合适的策略,增加了客户端的负担。

9. 观察者模式(Observer)
在这里插入图片描述
观察者模式定义了对象之间一对多的依赖关系,当一个对象状态改变时,他的所有依赖者都会收到通知并更新。
发生改变的对象称为观察目标,被通知的对象称为观察者。一个观察目标可以有多个不相关的观察者。
观察者提供了一种对象设计,让主题和观察者之间以松耦合的方式结合,易于扩展。

10. 责任链模式(Chain of Responsibility)
在这里插入图片描述

JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter等都用到了责任链模式。

责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将整个过程连成一条链,并沿着这条链处理该请求,直到有对象处理该请求为止。
链上的每个节点都可以设置其指标范围,并可以设置下一个处理节点。
链中的处理者并不需要知道整条链的结构,而是只需要保持指向下一节点对象的引用,大幅降低了系统耦合度。

不足:不方便调试问题

11. 代理模式(Proxy)
在这里插入图片描述
代理模式就是给目标对象提供一个代理,使得外部请求可以直接通过代理对象访问目标对象,从而起到保护目标对象,减少系统耦合度,符合开闭原则。
代理模式可以分为静态代理和动态代理两种。

(1)静态代理
静态代理的代理类在程序运行前就已经被创建了。

静态代理可以在符合开闭原则的情况下对目标对象进行扩展,但是我们也需要为每个代理类创建代理类,这样又会增加类的数量,并且接口一旦发生改变,代理类也需要进行修改。

(2)动态代理—JDK动态代理
动态代理是在程序运行期间通过反射机制动态生成代理对象。

在动态代理中,只需要一个动态处理器,真正的代理对象由JDK在运行时动态创建。
Proxy.newProxyInstance()方法接受三个参数:
①ClassLoader loader:指定当前目标对象使用的类加载器,获取加载器的方法是固定的
②Class<?>[] interfaces:指定目标对象实现的接口的类型,使用泛型方式确认类型
③InvocationHandler指定动态处理器,执行目标对象的方法时,会触发时间处理器方法。

动态代理减少了对接口的依赖,降低了耦合度,但是只能对接口的实现类进行代理,而普通类将永远无缘使用此代理模式。

(3)动态代理—CGLIB
CGLib采用了非常底层的字节码技术,其原理是通过ASM字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,进行横切织入。因采用的继承,不能对final修饰的类进行代理。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。

12. 迭代器模式(Iterator)
在这里插入图片描述
该模式用于有顺序地访问集合对象的元素,而不需要关心集合对象的底层实现,符合单一职责原则。

13. 解释器模式
在这里插入图片描述
解释器模式用来定义语言文法,建立解释器进行解析。
解释器模式在实际的软件开发中使用比较少,因为它会引起效率、性能以及维护等问题。

14. 命令模式
在这里插入图片描述
命令模式是对命令的封装,他把发出命令和执行命令责任分开,降低耦合度,提高扩展性。
优势:方便使更多的命令加入进来,并且发送方可以容易地实现对请求的撤销和恢复。

15. 中介者模式
在这里插入图片描述
中介者模式用来封装对象之间的关系,各个对象只需要和中介对象通信,就能和其他对象建立通信。他减少了具体对象之间的相互关系,提高了系统可重用性,简化了系统结构。
中介者是整个系统的核心所在,如果系统中出现了非常复杂的多对多关系时,需要先理清关系,确保系统设计正确后,再考虑使用中介者模式。

16. 备忘录模式(Memento)
在这里插入图片描述
备忘录模式,从名称上来理解就是保存资料,以防忘记。专业来说就是在不破坏原有封装的前提下,获取对象的内部状态,并在该对象之外保存这个状态。以后有需要就可将对象恢复到之前的状态。

17. 状态模式
在这里插入图片描述
状态模式就是根据当前状态做出对应的行为。
使用状态模式可以大幅减少代码中的if else流程判断语句,代价是会产生大量的类对象。
我们可以将一个状态和多个不同的行为封装到一个类中,只要改变对象状态即可改变对象行为。但使用不当也会导致程序越来越混乱。

18. 模板模式
在这里插入图片描述
模板模式就是对Java语言中继承的一种阐述。
我们通常可以将主干逻辑算法抽象在一个主类当中,遇见需要特殊处理的场景只需要让子类继承父类并重写父类的逻辑实现即可。

19. 访问者模式(Visitor)
在这里插入图片描述
访问者模式表示外部能够调用一个对象内的元素操作,并且外部操作不会改变对象内的元素。听起来是不是和代理模式很相似?
访问者模式适用于内部数据结构稳定,他将数据结构和数据操作相分离,因此访问者模式使得算法的增加变的比较容易。

20. 适配器模式
在这里插入图片描述
适配器模式就是将一个类的接口,转换为可以让另一个类期望的接口,他可以让两个原本互相不兼容的接口进行无缝对接。适配器就是一个两端兼容的中间件。
Java中的BufferedReader ,FileInputStream,FileOutputStream使用了适配器模式。

21. 桥接模式(Bridge)
在这里插入图片描述

当一个系统可以从多个角度进行分类,并且每一种分类都会变化,我们就需要将这多个角度分离出来,使他们独立变化,减少耦合度。
简单说就是将抽象部分与具体实现相分离出来,使他们可以独立变化。
桥接模式将继承关系转换为聚合关系。

22. 原型模式
在这里插入图片描述
原型模式就是用原型实例指定创建对象的实例,并通过复制这些原型创建新的对象。
主要应用于要创建的对象过大,而且需要频繁创建情景。优点在于简化了创建对象过程,提高了效率。

23. 构造者模式
在这里插入图片描述
构造者模式将复杂对象的构建与表示相分离,适用于对象内部结构复杂的场景。
在构造复杂对象的过程中,可以将复杂的构造过程分解在一个个具体的方法中,每一部分负责构建自己的模块,从而能够精确控制复杂对象的构建过程。
若几个产品之间存在较大差异时,不适用构造者模式。
构造者模式实际使用范围很有限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值