![](https://img-blog.csdnimg.cn/20200212093047161.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java设计模式
Java 23种设计模式的学习经验分享
da_kao_la
这个作者很懒,什么都没留下…
展开
-
访问者模式
访问者模式访问者模式用于编译器前端抽象语法树静态语法检查访问者模式访问者模式是23种设计模式中最复杂、最难理解的设计模式。访问者模式属于行为模式,将对象(被访问者)与操作(访问者)分离,适用于对象本身具有复杂结构且对象相对固定但需要频繁增加对于对象的操作的场景。访问者模式主要由被访问者和访问者组成,访问者对象通过visit方法访问被访问者对象,被访问者对象通过accept方法接受访问者的...原创 2020-02-14 10:29:15 · 689 阅读 · 0 评论 -
命令模式
命令模式通过命令类封装方法,常用于需要对方法的执行进行记录、缓存、撤销或是在方法执行时需要附加日志等操作的情形。下面以仓库卖货为例说明命令模式。仓库类:Stock.java,其中的sell方法从仓库中卖出货物。为了实现卖货订单缓存延迟处理以及订单撤销的操作,使用命令模式封装sell方法。public class Stock { private int storage; pub...原创 2020-02-13 09:56:42 · 132 阅读 · 0 评论 -
状态模式
状态模式是一种通过改变对象状态来改变对象行为的设计模式,最典型的应用是有限状态自动机。下面以一个自动售票机的例子说明状态模式。该自动售票机负责出售一种2元的车票,只能接受1元硬币。售票机有4个状态(S0: 起始状态,等待投币状态,等待再次投币状态,等待出票状态),允许3种输入(a0: 点击开始按钮,投入1元硬币,点击出票按钮)。售票机根据当前状态和用户输入动作的组合,决定售票机的响应(输出提示信...原创 2020-02-12 09:27:39 · 175 阅读 · 0 评论 -
备忘录模式
备忘录模式用于在不侵入原对象的情况下保存和回复对象状态。主要组成有原生类Originator,备忘录类Mementor,备忘录管理类CareTaker. Mementor负责记录Originator,CareTaker持有Mementor的引用,负责备忘录状态的管理。下面以一个可撤销的加减计算器为例说明备忘录模式。为了满足计算器类Calculator(相当于Originator)的功能完备性,Ca...原创 2020-02-11 11:52:25 · 122 阅读 · 0 评论 -
模板方法模式
模板方法模式的应用场景是某个算法由多个子算法构成,子算法的顺序是确定的,但子算法可以有多种选择。下面以做饭的例子说明该设计模式。抽象模板类:Cooker.javapublic abstract class Cooker { public abstract void prepareFood(); public abstract void cookFood(); publi...原创 2020-02-10 15:31:58 · 107 阅读 · 0 评论 -
迭代器模式与Java Iterator源码
迭代器模式迭代器模式是一种将集合的增删改操作与集合的顺序遍历操作分离的设计模式。集合只负责增删改操作,迭代器对于集合的内部类,专门负责顺序遍历。Java的Iterator是迭代器模式的经典实现。笔者jdk版本是11.0.4,不同版本的jdk的Iterator相关类及其实现有所不同,下面以jdk11.0.4为例。Iteratorjdk定义了一个Iterator接口,声明了hasNext, ne...原创 2020-02-08 12:06:44 · 266 阅读 · 0 评论 -
责任链模式
责任链模式中的各个职责对象具有明确的职责范围,超出职责范围内的职责,调用其他职责对象处理,最终形成一个链式的调用链。责任链模式的最显著特点就是抽象职责基类持有自身的引用,用于链式调用。责任链模式广泛见于web请求处理程序和事件响应程序中。 下面用一个整数数组过滤器为例介绍责任链模式。抽象职责基类:Filter.javaimport java.util.List;public abstrac...原创 2020-02-07 10:49:45 · 149 阅读 · 0 评论 -
中介者模式
中介者模式是一种行为模式,中介者模式中的中介者类协调多个类对象的交互行为,减少耦合。MVC模式中的controller是中介者模式的典型应用,controller作为中介者,协调model和view之间的交互。下面以简单的股票交易为例说明中介者模式。股民类:ShareHolder.javapublic class ShareHolder { private long id; p...原创 2020-02-06 10:36:16 · 220 阅读 · 0 评论 -
适配器模式
适配器模式用于系统修改时,新的外部类无法与旧系统兼容(或旧的类无法与新系统),增加适配器使得系统能够兼容外部类。适配器模式有两种实现方式:1. 适配器类继承外部类;2. 适配器持有外部类的引用。各个感觉考虑接口一致性,继承的方案对旧系统代码的改动会少一些。适配器模式是一种系统迭代时被迫采取的设计模式,而不是在系统设计之初就考虑的设计模式。因为在系统设计时,是不应该出现不兼容现象的。下面以电源适...原创 2020-02-05 11:01:19 · 166 阅读 · 0 评论 -
桥接模式
桥接模式把抽象化和具体化解耦,抽象化类通过持有具体化类的一个引用,实现桥接。下面以一个绘图程序为例说明桥接模式。具体化类接口:FillUtil.java,负责定义填充颜色。public interface FillUtil { public String fill();}具体化类:RedFill.java,定义红色填充。public class RedFill implemen...原创 2020-02-04 13:31:17 · 129 阅读 · 0 评论 -
组合模式
组合模式是一种用于表示同类对象间树形关系的设计模式。下面以行政区划为例介绍组合模式。统一的行政区划类(包含国家、省、市等各级行政区划单位):Area.javaimport java.util.LinkedList;public class Area { private String name; private LinkedList<Area> children;...原创 2020-02-04 11:24:22 · 251 阅读 · 0 评论 -
外观模式
外观模式是客户端和子系统的一个中介——外观类,统筹各子系统的功能,各客户端只需和中介交互而无需关心各子系统。子系统A:SystemA.javapublic class SystemA { public void operate() { System.out.println("System A works ..."); }}子系统B:SystemB.java...原创 2020-02-03 10:42:58 · 105 阅读 · 0 评论 -
代理模式
代理模式通过代理对象为原对象增加某种功能,是Spring AOP的实现方式。代理模式主要分为静态代理和动态代理. 静态代理模式与装饰器模式类似,在此就不展示代码了。静态代理的主要缺点是一个代理类只能用于一个被代理类,是一种『类专用』的代理,被代理类和代理类的组合数是乘积关系。下面通过代码演示Java中的动态代理模式。Java动态代理模式通过InvocationHandler接口和Proxy类实现...原创 2020-02-02 21:16:13 · 125 阅读 · 0 评论 -
享元模式
享元(Flyweight, 『轻量级』)模式,指的是一种构造对象时对于完全相同的对象直接返回之前已经构造的对象而无需重新构造的设计模式,用于大量创建相同对象的场景,减小内存使用。享元模式的关键是享元工厂类中用于缓存享元对象的哈希表。Java的字符串常量池就是享元模式的典型应用。下面用一个字符封装类SharedCharacter为例介绍享元模式,通过享元模式,同样的字符用同一个封装类对象,无需构造...原创 2020-02-01 15:53:03 · 116 阅读 · 0 评论 -
观察者模式
观察者模式主要由被观察者Subject类和观察者Observer类组成。Subject通过持有一个含有Observer类的引用的容器,绑定到多个观察者;Observer类通过持有一个Subject类的引用,绑定到一个固定的被观察者。当被观察者内部维护一个状态,当被观察者更新状态时,通知绑定的所有观察者。驱动类:Main.javapublic class Main { public st...原创 2020-02-01 11:40:06 · 119 阅读 · 0 评论 -
策略模式
策略模式用于分离算法和算法执行的环境,适用于算法变化多样的场景。下面以一个简单的命令行加减计算器的例子说明策略模式。策略模式首先需要一个策略接口。在计算器例子中,策略接口是操作Operation,用来抽象加、减等操作。public interface Operation { public int operate(int num1, int num2);}加操作、减操作是具体的操作...原创 2020-01-30 15:22:41 · 148 阅读 · 0 评论 -
装饰器模式与Java IO
装饰器模式装饰器模式是一种类继承的替代方案,用于以客户端透明的方式在基类上增加各种新的功能。相比于继承,使用装饰器模式可以显著减少类的个数。以下以绘图形状为例展示装饰器模式。装饰器模式的基础是形状接口Shape.public interface Shape { public void draw();}核心是实现了Shape接口并以Shape对象作为属性的ShapeDecorat...原创 2020-01-30 12:15:27 · 183 阅读 · 0 评论 -
建造者模式与StringBuilder源码
建造者模式建造者模式是一种对象创建模式,用于组合对象的创建。当一个对象由多个对象组合而成,并且组合可能发生较大的变化时,可以采用建造者模式将子对象的构造和子对象的组合封装起来。以下是快餐店组装食物的一个例子。驱动类:Main.javapublic class Main { public static void main(String[] args) { Meal ch...原创 2020-01-29 11:43:39 · 402 阅读 · 0 评论 -
原型模式
原型模式原型模式主要涉及对象的拷贝。之前针对Python语言写过一篇比较详细的关于对象赋值、浅拷贝、深拷贝的博客:python对象赋值、浅复制、深复制的区别. 下面就主要写一下浅拷贝和深拷贝在Java语言中的实现。Java浅拷贝Java的浅拷贝通过实现Cloneable接口并重写clone方法来实现,本质上是调用了Object类的clone方法由JNI实现了具体类的浅拷贝,用户无需关心其细节...原创 2020-01-27 19:19:33 · 136 阅读 · 0 评论 -
工厂模式
macOS High Sierrajdk 11.0.4简单工厂模式客户端(驱动类,或者业务逻辑)与产品类的构造分离工厂类的switch实现中,新增对象需要修改工厂类代码,耦合度较高;反射实现中,对于对象的构造依赖Java的反射机制,不够灵活代码(反射版本)驱动类:Main.javapublic class Main { public static void main(...原创 2020-01-26 21:25:29 · 174 阅读 · 0 评论 -
单例模式的反射漏洞和反序列化漏洞
单例模式的反射漏洞和反序列化漏洞除了枚举式单例模式外,其余4种在单例模式提到的单例模式的实现方式都存在反射漏洞和反序列化漏洞。package singleton;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.O...原创 2019-04-08 21:59:37 · 1317 阅读 · 1 评论 -
单例模式
单例模式设计模式是人们在开发中总结抽象的一些常用的程序设计范式。23种设计模式汇总如下图所示:单例模式是这样一种设计模式,使得一个类只能有一个实例。单例模式主要有以下5种实现方法。饿汉式饿汉式单例模式在类加载过程中就实例化类对象,因此称为“饿汉”。由于Java类加载的过程本身是线程安全的,因此饿汉式的优点是无需额外同步即线程安全,并发效率高,但由于无法延迟加载,导致占用空间资源。pac...原创 2019-04-07 22:24:50 · 908 阅读 · 0 评论