随笔分类 - 设计模式
摘要:一、前言 发布订阅模式也叫观察者模式,利用该模式可以进行代码解耦,很多框架都用到该设计模式,比如Spring的事件机制,guava的EventBus(事件总线)等,不清楚观察者模式的话可以查看本人之前写的博客《设计模式之观察者模式》。 为了更好的了解现有的事件框架实现原理,便手写了一个简单的
阅读全文
摘要:一、简介 当我们需要对一个类(A)的功能进行扩展的时候,可以选择使用继承通过子类(B)来实现,但是如果后来又要对A类增加一些功能且其中一些功能原来我们在子类B中已经实现过了,这时候怎么办呢? 这时候只能再用子类C继承A类并把代码重写一遍,然后子类就越来越多难以维护且有很多重复代码不够灵活。 我们知道
阅读全文
摘要:一、前言 状态模式,就是用类表示状态,好处是能通过切换类来方便地改变对象的状态,如果需要新加状态时也不用修改之前的代码。 二、介绍 假设现在有一个金库,金库和警报中心相连,金库里有警铃和通话用的电话,还有个时钟监视着现在的时间,白天或晚上使用警铃或打电话的表现都不一样。 不使用State模式的伪代码
阅读全文
摘要:一、前言 依然记得几年前面试被问到工厂方法模式和抽象工厂有什么区别时,我一脸懵逼哑口无言。本文就分别探讨下这两种设计模式。 二、Factory Method 工厂方法(Factory Method)模式,将实例的生成交给子类,父类决定实例的生成方式,但不决定所要生成的具体的类。 这样就可以将生成实例
阅读全文
摘要:一、前言 最近复习发现AQS使用了模板方法,自定义同步器时需要重写几个AQS提供的模板方法,Spring的DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions() 方法也使用了该设计模式,于是写篇文章加深理解。 模板方法模式的定义
阅读全文
摘要:一、简介 观察者模式(发布/订阅模式),定义了对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 有很多项目都用到了该设计模式,比如Spring的事件机制、消息队列等。 Java提供了两个接口java.util.Observable和java.util.Obs
阅读全文
摘要:一、前言 责任链模式很多框架都有用到,其中一个经典场景就是Tomcat对HTTP请求的处理。 Tomcat处理HTTP请求时就会处理请求头和请求体两部分,当然,Tomcat的真正实现会将HTTP请求切分成更细的部分进行处理。如果请求各部分的逻辑都在一个类中实现,这个类会非常臃肿。如果请求通过增加新字
阅读全文
摘要:代理模式就是控制对象的访问,客户访问代理对象,代理对象找真正的对象做事。包括静态代理,动态代理,虚拟代理,远程代理等。这里就简单些下静态代理和动态代理。 1.创建计算器接口 1 package cn.sp.test4; 2 3 /** 4 * Created by 2YSP on 2017/9/1.
阅读全文
摘要:定义:迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 1 package cn.sp.test1; 2 3 4 /** 5 * 菜单类 6 * Created by 2YSP on 2017/7/14. 7 */ 8 public class MenuItem {
阅读全文
摘要:一、Adapter模式 适配器模式将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。 生活中的例子就是,如果想让12V的笔记本电脑在220V的交流电下工作的话,就需要在中间增加一个适配器。 适配器模式有两种: 类适配器模式(使用继承实现的) 对象适配器模式(使用委托
阅读全文
摘要:命令模式的核心是把方法调用封装起来,调用的对象不需要关心是如何执行的。 定义:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也可以支持撤销操作。 先看一个例子,设计一个家电遥控器的API,可以通过遥控器发出命令来控制不同生产商生产的家电,比如关灯、开灯。 以
阅读全文
摘要:个人理解,单例模式就是创建一个独一无二的对象,在我们需要时才创建,如果用全局静态变量代替的话,就必须在程序一开始就创建,可能造成资源浪费。 单例模式确保一个类只有一个实例,并提供一个全局的访问点。 先来看看一个经典的单例模式代码: 1 package cn.sp.singleton; 2 /** 3
阅读全文