设计模式
文章平均质量分 64
吕布辕门
逆水行舟,不进则退!
展开
-
【Java 23 种设计模式】访问者
访问者简单来说,访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其它的修改的效果。最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象原创 2022-04-06 07:30:00 · 100 阅读 · 0 评论 -
【Java 23 种设计模式】模板方法
模板方法定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法(Template Method)是一个比较简单的模式。它的主要思想是,定义一个操作的一系列步骤,对于某些暂时确定不下来的步骤,就留给子类去实现好了,这样不同的子类就可以定义出不同的步骤。因此,模板方法的核心在于定义一个“骨架”。我们还是举例说明。假设我们开发了一个从数据库读取设置的类:public class Setting { public fina原创 2022-04-05 07:45:00 · 723 阅读 · 0 评论 -
【Java 23 种设计模式】策略
策略定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。策略模式:Strategy,是指,定义一组算法,并把其封装到一个对象中。然后在运行时,可以灵活的使用其中的一个算法。策略模式在Java标准库中应用非常广泛,我们以排序为例,看看如何通过Arrays.sort()实现忽略大小写排序:import java.util.Arrays;public class Main { public static void main(String[]原创 2022-04-04 10:31:18 · 89 阅读 · 0 评论 -
【Java 23 种设计模式】状态(18)
状态允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。状态模式(State)经常用在带有状态的对象中。什么是状态?我们以QQ聊天为例,一个用户的QQ有几种状态:离线状态(尚未登录);正在登录状态;在线状态;忙状态(暂时离开)。如何表示状态?我们定义一个enum就可以表示不同的状态。但不同的状态需要对应不同的行为,比如收到消息时:if (state == ONLINE) { // 闪烁图标} else if (state == BUSY) {原创 2022-04-03 07:00:00 · 221 阅读 · 0 评论 -
【Java 23 种设计模式】备忘录&观察者(17)
备忘录在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。备忘录模式(Memento),主要用于捕获一个对象的内部状态,以便在将来的某个时候恢复此状态。其实我们使用的几乎所有软件都用到了备忘录模式。最简单的备忘录模式就是保存到文件,打开文件。对于文本编辑器来说,保存就是把TextEditor类的字符串存储到文件,打开就是恢复TextEditor类的状态。对于图像编辑器来说,原理是一样的,只是保存和恢复的数据格式比较复杂而已。Java的序列化也可以看作是备忘录模式。在使用文原创 2022-04-02 07:00:00 · 115 阅读 · 0 评论 -
【Java 23 种设计模式】中介(16)
中介用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介模式(Mediator)又称调停者模式,它的目的是把多方会谈变成双方会谈,从而实现多方的松耦合。有些童鞋听到中介立刻想到房产中介,立刻气不打一处来。这个中介模式与房产中介还真有点像,所以消消气,先看例子。考虑一个简单的点餐输入:汉堡鸡块薯条咖啡选择全部 取消所有 反选这个小系统有4个参与对象:多选框;“选择全部”按钮;“取消所有”按钮;“反原创 2022-04-01 07:00:00 · 147 阅读 · 0 评论 -
【Java 23 种设计模式】解释器&迭代器(15)
解释器给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式(Interpreter)是一种针对特定问题设计的一种解决方案。例如,匹配字符串的时候,由于匹配条件非常灵活,使得通过代码来实现非常不灵活。举个例子,针对以下的匹配条件:以+开头的数字表示的区号和电话号码,如+861012345678;以英文开头,后接英文和数字,并以.分隔的域名,如www.liaoxuefeng.com;以/开头的文件路径,如/path/to/file.txt;原创 2022-03-31 07:00:00 · 133 阅读 · 0 评论 -
【Java 23 种设计模式】命令(14)
命令将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。命令模式(Command)是指,把请求封装成一个命令,然后执行该命令。如:司令员下令让士兵去干件事情,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。在使用命令模式前,我们先以一个编辑器为例子,看看如何实现简单的编辑操作:p原创 2022-03-30 07:00:00 · 180 阅读 · 0 评论 -
【Java 23 种设计模式】责任链(13)
责任链使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。责任链模式(Chain of Responsibility)是一种处理请求的模式,它让多个处理器都有机会处理该请求,直到其中某个处理成功为止。责任链模式把多个处理器串成链,然后让请求在链上传递: ┌─────────┐ │ Request │ └─────────┘ │┌ ─ ─ ─ ─ ┼ ─ ─原创 2022-03-29 07:00:00 · 197 阅读 · 0 评论 -
【Java 23 种设计模式】享元(12)
享元运用共享技术有效地支持大量细粒度的对象。享元(Flyweight)的核心思想很简单:如果一个对象实例一经创建就不可变,那么反复创建相同的实例就没有必要,直接向调用方返回一个共享的实例就行,这样即节省内存,又可以减少创建对象的过程,提高运行速度。享元模式在Java标准库中有很多应用。我们知道,包装类型如Byte、Integer都是不变类,因此,反复创建同一个值相同的包装类型是没有必要的。以Integer为例,如果我们通过Integer.valueOf()这个静态工厂方法创建Integer实例,当原创 2022-03-28 09:18:44 · 162 阅读 · 0 评论 -
【Java 23 种设计模式】组合(11)
组合将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式(Composite)经常用于树形结构,为了简化代码,使用Composite可以把一个叶子节点与一个父节点统一起来处理。我们来看一个具体的例子。在XML或HTML中,从根节点开始,每个节点都可能包含任意个其他节点,这些层层嵌套的节点就构成了一颗树。要以树的结构表示XML,我们可以先抽象出节点类型Node:public interface Node { // 添加一个节点为子节点原创 2022-03-28 09:17:34 · 73 阅读 · 0 评论 -
【Java 23 种设计模式】代理(9)
代理为其他对象提供一种代理以控制对这个对象的访问。代理模式,即Proxy,它和Adapter模式很类似。我们先回顾Adapter模式,它用于把A接口转换为B接口:public BAdapter implements B { private A a; public BAdapter(A a) { this.a = a; } public void b() { a.a(); }}而Proxy模式不是把A接口转换成B接口,它还原创 2022-03-27 07:00:00 · 118 阅读 · 0 评论 -
【Java 23 种设计模式】桥接(8)
桥接将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式的定义非常玄乎,直接理解不太容易,所以我们还是举例子。假设某个汽车厂商生产三种品牌的汽车:Big、Tiny和Boss,每种品牌又可以选择燃油、纯电和混合动力。如果用传统的继承来表示各个最终车型,一共有3个抽象类加9个最终子类: ┌───────┐ │ Car │ └───────┘原创 2022-03-26 07:15:00 · 163 阅读 · 0 评论 -
【Java 23 种设计模式】适配器(7)
适配器将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。适配器模式是Adapter,也称Wrapper,是指如果一个接口需要B接口,但是待传入的对象却是A接口,怎么办?我们举个例子。如果去美国,我们随身带的电器是无法直接使用的,因为美国的插座标准和中国不同,所以,我们需要一个适配器:在程序设计中,适配器也是类似的。我们已经有一个Task类,实现了Callable接口:publi原创 2022-03-26 07:00:00 · 214 阅读 · 0 评论 -
【Java 23 种设计模式】 建造者(6)
建造者将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式(Builder)是使用多个“小型”工厂来最终创建出一个完整对象。当我们使用Builder的时候,一般来说,是因为创建这个对象的步骤比较多,每个步骤都需要一个零部件,最终组合成一个完整的对象。我们仍然以Markdown转HTML为例,因为直接编写一个完整的转换器比较困难,但如果针对类似下面的一行文本:# this is a heading转换成HTML就很简单:<h1>this is a原创 2022-03-25 07:00:00 · 128 阅读 · 0 评论 -
【Java 23 种设计模式】 原型(5)
原型用原型实例指定创建对象的类型,并且通过拷贝这些原型创建新的对象。该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。我们举个例子:如果我们已经有了一个String[]数组,想再创建一个一模一样的String[]数组,怎么写?实际上创建过程很简单,就是把现有数组的元素复制到新数组。如果我们把这个创建过程封装一下,就成了原型模式。用代码实现如下:// 原型:String[] original = { "Apple", "Pear", "Banana" };原创 2022-03-22 12:01:23 · 62 阅读 · 0 评论 -
【Java 23 种设计模式】 单例模式(4)
单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式(Singleton)的目的是为了保证在一个进程中,某个类有且仅有一个实例。因为这个类只有一个实例,因此,自然不能让调用方使用new Xyz()来创建实例了。所以,单例的构造方法必须是private,这样就防止了调用方自己创建实例,但是在类的内部,是可以用一个静态字段来引用唯一创建的实例的:public class Singleton { // 静态字段引用唯一实例: private static final原创 2022-03-24 07:45:00 · 84 阅读 · 0 评论 -
【Java 23 种设计模式】抽象工厂(3)
抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式(Abstract Factory)是一个比较复杂的创建型模式。抽象工厂模式和工厂方法不太一样,它要解决的问题比较复杂,不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品: ┌────────┐ ─ >│Pr原创 2022-03-24 07:00:00 · 76 阅读 · 0 评论 -
【Java 23 种设计模式】工厂方法(2)
工厂方法定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。工厂方法即Factory Method,是一种对象创建型模式。工厂方法的目的是使得创建对象和使用对象是分离的,并且客户端总是引用抽象工厂和抽象产品:┌─────────────┐ ┌─────────────┐│ Product │ │ Factory │└─────────────┘ └─────────────┘原创 2022-03-23 07:00:00 · 98 阅读 · 0 评论 -
【Java 23 种设计模式】原则(1)
原则设计模式的来源设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。设计模式的六大原则总原则——开闭原则(Open Closed Principle)一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。原创 2022-03-22 11:51:02 · 176 阅读 · 0 评论