![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 73
Forget_Sky
这个作者很懒,什么都没留下…
展开
-
设计模式(二十三)—— 解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式(Interpreter)是一种针对特定问题设计的一种解决方案。例如,匹配字符串的时候,由于匹配条件非常灵活,使得通过代码来实现非常不灵活。举个例子,针对以下的匹配条件:以+开头的数字表示的区号和电话号码,如+861012345678; 以英文开头,后接英文和数字,并以.分隔的域名,如www.liaoxuefeng.com; 以/开头的文件路径,如/path/to/file.txt; .原创 2021-03-26 19:03:12 · 134 阅读 · 0 评论 -
设计模式(二十二)—— 中介者模式
模式的定义与特点中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。中介者模式是一种对象行为型模式,其主要优点如下。类之间各司其职,符合迪米特法则。 降低了对象之间的耦合性,使得对象易于独立地被复用。 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。其主要缺点是:中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同原创 2021-03-26 18:42:53 · 58 阅读 · 0 评论 -
设计模式(二十一)—— 访问者模式
模式的定义与特点访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。访问者(Visitor)模式是一种对象行为型模式,其主要优点如下。扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。 复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复原创 2021-03-26 18:16:11 · 616 阅读 · 0 评论 -
设计模式(二十)—— 状态模式
状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。状态模式是一种对象行为型模式,其主要优点如下。结构清晰,状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。 将状态转换显示化,减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。 状态类职责明确,有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。状原创 2021-03-26 16:44:37 · 103 阅读 · 0 评论 -
设计模式(十九)—— 备忘录模式
模式的定义与特点备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。备忘录模式是一种对象行为型模式,其主要优点如下。提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录原创 2021-03-26 00:32:00 · 57 阅读 · 0 评论 -
设计模式(十八)—— 命令模式
命令模式的定义与特点命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式的主要优点如下。通过引入中间件(抽象接口)降低系统的耦合度。 扩展性良好,增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,且满足“开闭原则”。其缺点是:可能产生大量具体的命令类原创 2021-03-26 00:20:21 · 33 阅读 · 0 评论 -
设计模式(十七)—— 责任链模式
在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的地址相同来决定是否接收;还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常;模式的定义与特点责任链(Chain原创 2021-03-26 00:05:44 · 90 阅读 · 0 评论 -
设计模式(十六)—— 迭代器模式
在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码,这违背了 “开闭原则”。既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式会存在两个缺点:暴露了聚合类的内部表示,使其数据不安全; 增加了客户的负担。“迭代器模式”能较好地克服以上缺点,它在客户访问类与聚合类之间插原创 2021-03-25 20:49:29 · 77 阅读 · 0 评论 -
设计模式(十五)—— 模板方法模式
在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。这样的例子在生活中还有很多,例如,一个人每天会起床、吃饭、做事原创 2021-03-23 18:50:35 · 91 阅读 · 0 评论 -
设计模式(十二)—— 享元模式
在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景。享元模式的定义与特点享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少原创 2021-03-23 01:07:12 · 120 阅读 · 0 评论 -
设计模式(十一)—— 组合模式
在现实生活中,存在很多“部分-整体”的关系,例如,学习用品中的书与书包、生活用品中的衣服与衣柜、以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。组合模式的定义与特点组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访原创 2021-03-23 00:48:30 · 114 阅读 · 0 评论 -
设计模式(十)—— 桥接模式
在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。桥接模式的定义与特点桥接(Bridge)模式的定义如下:将抽象与实现分原创 2021-03-23 00:28:24 · 100 阅读 · 0 评论 -
设计模式(九)—— 外观模式
外观模式的定义与特点外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。在日常编码工作中,我们都在有意无意的大量使用外观模式。只要是高层模块需要调度多个子系统(2个以上的类对象),我们都会自觉地创建一个新的类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。尤其是现阶段各种第三方原创 2021-03-22 23:44:50 · 68 阅读 · 0 评论 -
设计模式(七)—— 装饰器模式
装饰器模式的定义与特点装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。装饰器模式的主要优点有:不改变原类文件。 不使用继承。 动态扩展。其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。装饰器模式的结构与实现1. 模式的结构装饰器模式主要包含以下角色。抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。 具体构件(Concre原创 2021-03-22 00:13:57 · 395 阅读 · 0 评论 -
设计模式(四)——抽象工厂模式
工厂方法模式中考虑的是一类产品的生产,同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。本节要介绍的抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,图 1 所示的是海尔工厂和 TCL 工厂所生产的电视机与空调对应的关系图。图1 电器工厂的产品等级与产品族模式的定义...原创 2021-02-02 13:03:43 · 77 阅读 · 0 评论 -
设计模式(二)—— 原型模式
原型模式的定义与特点原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。原型模式的优点:Java自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。 可以使用深克隆方式保存对象的状态,使原创 2021-01-25 14:25:54 · 65 阅读 · 0 评论 -
设计模式概述
设计模式是一套被反复使用、多数人知晓、经过分类,用来解决某类问题的代码设计经验总结。使用设计模式的目的是提高代码的复用率,降低开发成本和周期;提高代码的可维护性,可扩展性和可靠性,而且更容易让人理解。1. 设计模式的分类设计模式分为三大类共23种:创建型模式(5种):单例模式、建造者模式、工厂方法模式、抽象工厂模式、原型模式结构型模式(7种):适配器模式、装饰器模式、代理模式、...原创 2018-12-18 17:23:51 · 161 阅读 · 0 评论 -
设计模式(一)—— 单例模式
Java中单例模式是一种应用非常广泛的设计模式,它主要用来保证java的某个类只有一个实例存在, 可以避免实例对象的重复创建,从而节约时间、空间,并且可以避免由于操作多个实例带来的逻辑错误。如果一个对象的使用贯穿整个应用程序,而且起到了全局统一管控的作用,那么单例模式也许是一种不错的选择。单例模式虽然有多种写法,但大部分写法都有不足, 下面逐一介绍。1. 饿汉模式public cla...原创 2018-12-05 19:26:58 · 126 阅读 · 0 评论 -
设计模式(六)—— 适配器模式
1. 介绍适配器模式是把一个类的接口变换成客户端的所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。2. 分类适配器模式有类的适配器模式和对象的适配器模式两种形式。2.1 类的适配器模式类的适配器模式是把适配的类的API转换成为目标类的API.从上图中可以看出:Target期待调用Request方法,而Adaptee并没有(这就是所谓的不...原创 2018-12-13 17:08:06 · 126 阅读 · 0 评论 -
设计模式(十三)—— 策略模式
1. 定义策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立。2. 结构(1)策略接口角色IStrategy:用来约束一系列具体的策略算法,策略上下文角色使用此策略接口来调用具体的策略所实现的算法。(2)具体的策略实现角色ConcreteStrategy:具体的策略实现。(3)策略上下文角色Str...原创 2018-12-14 11:57:57 · 130 阅读 · 0 评论 -
设计模式(十四)—— 观察者模式
1.观察者模式定义了一系列对象之间的一对多关系,当一个对象的状态改变,其他依赖者都会收到通知。2.观察者模式包含四个角色(1)抽象被观察者(2)抽象观察者(3)具体被观察者(4)具体观察者3.具体的被观察者和观察者之间是松耦合的,被观察者唯一依赖的就是实现了观察者接口的一个对象列表。被观察者不需要知道观察者的具体实现类是谁、做了些什么。我们可以随时新增,修改观察者,而不用修...原创 2018-12-07 15:46:39 · 154 阅读 · 0 评论 -
设计模式(三)—— 工厂方法模式
工厂模式一般分为三种:简单工厂, 工厂方法, 抽象工厂简单工厂简单工厂模式又叫静态工厂方法模式,是通过专门定义一个类负责创建其他类的实例, 被创建的实例通常都具有共同的父类。简单工厂将对象的创建过程进行了封装,用户不需要知道具体的创建过程,只需要调用工厂类获取对象即可。工厂类的写法是通过switch-case或if-else来判断对象的创建过程,是个具体的类,并非接口抽象类。缺...原创 2018-12-10 15:38:22 · 113 阅读 · 0 评论 -
设计模式(五)——建造者模式
1. 定义建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。2. 建造者模式通常包括下面几个角色:(1)Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。(2)ConcreteBuil...原创 2018-12-10 18:41:03 · 180 阅读 · 1 评论 -
设计模式(八)—— 代理模式
1. 定义代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式。代理对象代为执行目标对象的方法,并在此基础上进行相应的扩展。代理模式遵循开闭原则,代理对象和目标对象实现共同的接口,主要组成如下图所示。2. 作用隔离客户端和目标对象,而且可以扩展功能3.分类按照代理创建的时期来分类,可以分为两种:静态代理、动态代理(jdk动态代理、c...原创 2018-12-18 11:25:12 · 163 阅读 · 0 评论 -
设计模式(三)—— 发布-订阅模式
1. 发布订阅模式和观察者模式很相似,但并不等同发布订阅模式是一种消息范式,消息发送者(发布者)不会将消息直接发送给特定的接受者(订阅者),而是将发布的消息分为不同的类别,通过一个中间的消息代理来调度消息,发布者无需了解有哪些订阅者存在。同样的,订阅者也只接受自己感兴趣的那一类消息,无需了解发布者是否存在。 发布者和订阅者都不知道彼此的存在,是完全的松耦合。发布者(publishers)的...原创 2018-12-07 18:20:43 · 506 阅读 · 0 评论