
设计模式
文章平均质量分 79
素履之往、、
这个作者很懒,什么都没留下…
展开
-
设计模式系列-第二十六章(23种设计模式总结)
一、创建型设计模式创建型设计模式包括:单例模式、工厂模式、建造者模式、原型模式。它主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。1.1 单例模式 单例模式用来创建全局唯一的对象。一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例模式。单例有几种经典的实现方式,它们分别是:饿汉式、懒汉式、双重检测、静态内部类、枚举。尽管单例是一个很常用的设计模式,在实际的开发中,我们也确实经常用到它,但是,有些人认为单例是一种反模式(anti...翻译 2021-04-14 15:52:06 · 849 阅读 · 0 评论 -
设计模式系列-第二十五章(行为型-中介模式)
一、中介模式的定义 中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。 实际上,中介模式的设计思想跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系(或者说依赖关系)从多对多(网状关系)转换为一对多(星状关系)。原来一个对象要跟 n 个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低了代码的复杂度,提高了代码的可读性和可维护性。二、中介模式的实现 假设我...翻译 2021-04-14 15:10:12 · 108 阅读 · 0 评论 -
设计模式系列-第二十四章(行为型-解释器模式)
一、解释器模式 解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。它用来描述如何构建一个简单的“语言”解释器。解释器模式很小众,只在一些特定的领域会被用到,比如编译器、规则引擎、正则表达式。二、解释器模式的实现假设我们定义了一个新的加减乘除计算“语言”,语法规则如下:运算符只包含加、减、乘、除,并且没有优先级的概念; 表达式(也就是前面提到的“句子”)中,先书写数字,后书写运算符,空格隔开; 按照先后顺序,取出两个数字和一个运算符计算结果,结果...原创 2021-04-14 15:01:16 · 122 阅读 · 0 评论 -
设计模式系列-第二十三章(行为型-命令模式)
现在我们只剩下 3 个模式还没有学习,它们分别是:命令模式、解释器模式、中介模式。这 3 个模式使用频率低、理解难度大,只在非常特定的应用场景下才会用到,所以,不是我们学习的重点,你只需要稍微了解,见了能认识就可以了。一、命令模式的定义 命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。 落实到编码实现,命令模式用的最核心的实现手段,是将函数封装成对...原创 2021-04-14 14:41:11 · 102 阅读 · 0 评论 -
设计模式系列-第二十二章(行为型-备忘录模式)
一、备忘录模式的定义 备忘录模式,也叫快照(Snapshot)模式。在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。这个模式的定义主要表达了两部分内容。一部分是,存储副本以便后期恢复。这一部分很好理解。另一部分是,要在不违背封装原则的前提下,进行对象的备份和恢复。二、备忘录模式实现 示例一个小程序,可以接收命令行的输入。用户输入文本时,程序将其追加存储在内存文本中;用户输入“:list”,程序在命令行中输出内存文本的内容;...原创 2021-04-14 14:19:58 · 113 阅读 · 0 评论 -
设计模式系列-第二十一章(行为型-访问者模式)
一、访问者模式定义 访问者模式允许一个或者多个操作应用到一组对象上,设计意图是解耦操作和对象本身,保持类职责单一、满足开闭原则以及应对代码的复杂性,实际策略加工厂模式也可以达到同样效果。虽然策略模式也能实现,但对于多种类型的同个操作聚合在了一起,这种情况属于同父类的一些相同操作就能抽私有共用方法,相对于策略模式会更加优雅和简单。。对于访问者模式,学习的主要难点在代码实现。而代码实现比较复杂的主要原因是,函数重载在大部分面向对象编程语言中是静态绑定的。也就是说,调用类的哪个重载函数,是在编译期间,由...原创 2021-04-14 12:26:19 · 100 阅读 · 0 评论 -
设计模式系列-第二十章(行为型-迭代器模式)
一、迭代器的定义 上一课,我们学习了状态模式。状态模式是状态机的一种实现方法。这一章我们学习迭代器模式,迭代器也是比较简单的一种设计模式,,它用来遍历集合对象。这里说的“集合对象”也可以叫“容器”“聚合对象”,实际上就是包含一组对象的对象,比如数组、链表、树、图、跳表。迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。 迭代器是用来遍历容器的,所以,一个完整的迭代器模式一般会涉及容器和容器迭代器两部分内容。为了达到基于接口而非实现编程的目的,容器又包...原创 2021-04-14 11:51:33 · 105 阅读 · 0 评论 -
设计模式系列-第十九章(行为型-状态模式)
一、状态模式的定义 状态模式。虽然网上有各种状态模式的定义,但是你只要记住状态模式是状态机的一种实现方式即可,状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。状态机又叫有限状态机,它有 3 个部分组成:状态、事件、动作。其中,事件也称为转移条件。事件触发状态的转移及动作的执行。不过,动作不是必须的,也可能只转移状态,不执行任何动作。 状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。从这一点上来看,它有点像我们之前讲到的组合模式(主要针对树结构的...原创 2021-04-13 17:55:16 · 129 阅读 · 0 评论 -
设计模式系列-第十八章(行为型-职责链模式)
一、职责链模式定义 职责链模式,将请求的发送和接收解耦,将接收对象串成一条链,并沿着这条链传递这个请求,链条上的每个对象各自承担各自的处理职责。 在 GoF 给出的定义中,如果处理器链上的某个处理器能够处理这个请求,那就不会继续往下传递请求。实际上,职责链模式还有一种变体,那就是请求会被所有的处理器都处理一遍,不存在中途终止的情况。职责链模式和模板模式、策略模式的作用类似,主要是复用和扩展。职责链常见的应用主要是过滤器和拦截器。二、职责链模式的实现2.1 简单的实现 ...原创 2021-04-13 17:32:36 · 136 阅读 · 0 评论 -
设计模式系列-第十七章(行为型-策略模式)
一、策略模式定义 策略模式,定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。 工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者。策略模式跟两者类似,也能起到解耦的作用,不过,它解耦的是策略的定义、创建、使用这三部分。策略模式通常跟工厂一起配合使用。策略侧重如何灵活选择替换,工厂侧重怎么创建实例。二、策略模式的实现2.1 策略类定义 策略类的定义比较简单,包含一...原创 2021-04-13 15:58:21 · 110 阅读 · 0 评论 -
设计模式系列-第十六章(行为型-模板模式)
一、模板模式定义 模板模式,全称是模板方法设计模式。模板模式有两大作用:复用和扩展。模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。二、模板模式的代码示例 原理很简单,代码实现就更加简单,如下所示。templateMethod() 函数定义为 final,是为了避免子类重写它。method1() 和 method2() 定义为 abstract,是为了强迫子类去实现。不过,这些都不是...原创 2021-04-13 15:47:20 · 115 阅读 · 0 评论 -
设计模式系列-第十五章(行为型-观察者网模式)
一、观察者模式定义 观察者模式也被称为发布订阅模式。定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。设计模式要干的事情就是解耦,创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为型模式是将不同的行为代码解耦,具体到观察者模式,它将观察者和被观察者代码解耦。借助设计模式,我们利用更好的代码结构,将一大坨代码拆分成职责更单一的小类,..原创 2021-04-13 15:34:15 · 134 阅读 · 0 评论 -
设计模式系列-第十四章(结构型-享元模式)
一、享元模式定义 所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。 具体来讲,当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变对象,我们就可以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存中对象的数量,起到节省内存的目的。实际上,不仅仅相同对象可以设计成享元,对于相似对象,我们也可以将这些对象中相同的部分(字段)提取出来,设计成享元,让这些大量相似对象引用这些享元。二、享元模式...原创 2021-04-13 11:09:04 · 127 阅读 · 0 评论 -
设计模式系列-第十三章(结构型-组合模式)
一、组合模式定义 组合模式主要是用来处理树形结构数据。这里的“数据”,可以简单理解为一组对象集合。组合模式的设计思路,与其说是一种设计模式,倒不如说是对业务场景的一种数据结构和算法的抽象。其中,数据可以表示成树这种数据结构,业务需求可以通过在树上的递归遍历算法来实现。 组合模式,将一组对象组织成树形结构,将单个对象和组合对象都看做树中的节点,以统一处理逻辑,并且它利用树形结构的特点,递归地处理每个子树,依次简化代码实现。使用组合模式的前提在于,你的业务场景必须能够表示成树形结构。所以,组合...原创 2021-04-12 17:59:41 · 104 阅读 · 0 评论 -
设计模式系列-第十二章(结构型-门面模式)
一、门面模式定义 门面模式,也叫外观模式,门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。 门面模式主要解决的是接口设计问题,接口粒度设计得太大,太小都不好。太大会导致接口不可复用,太小会导致接口不易用。在实际的开发中,接口的可复用性和易用性需要“微妙”的权衡。针对这个问题,我的一个基本的处理原则是,尽量保持接口的可复用性,但针对特殊情况,允许提供冗余的门面接口,来提供更易用的接口。适配器模式是做接口转换,解决的是原接口和目标接口不匹配的问题。门面模式做接口整合,解决...原创 2021-04-12 17:47:17 · 92 阅读 · 0 评论 -
设计模式系列-第十一章(结构型-适配器模式)
一、适配器的定义 适配器模式的英文翻译是 Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。二、适配器的两种实现 适配器实现主要分类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。具体的代码实现如下所示。其中...翻译 2021-04-12 17:41:51 · 146 阅读 · 0 评论 -
设计模式系列-第十章(结构型-装饰器模式)
装饰器模式和代理模式,桥接模式比较类似,都是对类的结构整合,利用组合等方式对类的功能进行增强。尽管它们的代码结构很相似,但是每种设计模式的意图是不同的。就拿比较相似的代理模式和装饰器模式来说吧,代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。 装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始...原创 2021-04-12 17:33:00 · 132 阅读 · 0 评论 -
设计模式系列-第九章(结构型-桥接模式)
桥接模式的原理比较难理解,但代码实现相对简单。对于这个模式有两种不同的理解方式。在 GoF 的《设计模式》一书中,桥接模式被定义为:“将抽象和实现解耦,让它们可以独立变化。”在其他资料和书籍中,还有另外一种更加简单的理解方式:“一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。一、第一种理解-抽象和实现解耦 对于第一种 GoF 的理解方式,弄懂定义中“抽象”和“实现”两个概念,是理解它的关键。定义中的“抽象”,指的并非“抽象类”或“接...原创 2021-04-12 17:24:28 · 97 阅读 · 0 评论 -
设计模式系列-第八章(结构型-代理模式)
一、代理模式概念 代理模式(Proxy Design Pattern)的原理和代码实现都不难掌握。它在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。代理式一般附件功能为和本业务相关性不大的功能,如果附加功能和本业务有关系,更适合用装饰者模式。二、代理模式实现 举例对userCotroller进行功能增强,主要统计其性能。使用性能计数器(MetricsCollector 类,用来收集接口请求的原始数据,比如访问时间、处理时长等)。 代理模式的实现有继承,...原创 2021-03-31 15:24:34 · 160 阅读 · 0 评论 -
设计模式系列-第七章(创建型-原型模式)
一、原型模式的原理 如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。 创建对象包含的申请内存、给成员变量赋值这一过程,本身并不会花费太多时间,或者说对于大部分业务系统来说,这点时间完全是可以忽略的。应用一个复杂的模式,只得到一点点的性...原创 2021-03-31 12:18:49 · 150 阅读 · 0 评论 -
设计模式系列-第六章(创建型-建造者模式)
一、建造者模式定义和场景 建造者模式的官方定义比较晦涩难懂,实际实现比较简单。设计模式实际就是武功招式,设计思想和原则是武功心法,设计模式无非就是一些前人开发,根据设计思想原则总结的固定写法。所以设计模式更多还是看适合的场景以及解决了什么问题。 如果一个类中有很多属性,为了避免构造函数的参数列表过长,影响代码的可读性和易用性,我们可以通过构造函数配合 set() 方法来解决。但是,如果存在下面情况中的任意一种,我们就要考虑使用建造者模式了。我们把类的必填属性放到构造函数中,强制创建对...原创 2021-03-30 18:10:11 · 136 阅读 · 0 评论 -
设计模式系列-第五章(创建型-工厂模式)
一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。在这三种细分的工厂模式中,简单工厂、工厂方法原理比较简单,在实际的项目中也比较常用。而抽象工厂的原理稍微复杂点,在实际的项目中相对也不常用。一、简单工厂 类似针对不同类型(yaml,xml,json...)配置文件的解析,代码中存在 if-else 分支判断文件类型,动态地根据不同的类型创建不同的对象。这时候可以采用简单工厂模式。我们可以将if else逻辑从业务代码剥离出来,专门将生产类的判断逻辑写在一个方法中。为了让..原创 2021-03-30 17:47:20 · 136 阅读 · 0 评论 -
设计模式系列-第四章(创建型-单例模式)
一、单例的定义 单例设计模式(Singleton Design Pattern)理解起来非常简单。一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。从业务概念上,有些数据在系统中只应该保存一份,就比较适合设计为单例类。比如,系统的配置信息类。除此之外,我们还可以使用单例解决资源访问冲突的问题。二、普通单例的实现 2.1 饿汉式饿汉式的实现方式,在类加载的期间,就已经将 instance 静态实例初始化好了,所以,...翻译 2021-03-30 16:08:40 · 137 阅读 · 0 评论 -
设计模式系列-第三章(设计原则-其他原则)
一、迪米特法则(LOD) 迪米特法则的英文翻译是:Law of Demeter,缩写是 LOD。利用这个原则,能够帮我们实现代码的“高内聚、松耦合”。所谓高内聚,就是指相近的功能应该放到同一个类中,不相近的功能不要放到同一个类中。我们前面讲过的单一职责原则是实现代码高内聚非常有效的设计原则。松耦合是说,在代码中,类与类之间的依赖关系简单清晰。前面讲的依赖注入、接口隔离、基于接口而非实现编程,以及迪米特法则,都是为了实现代码的松耦合。 “高内聚、松耦合”是一个非常重要的设计思...原创 2021-03-30 15:37:24 · 135 阅读 · 0 评论 -
设计模式系列-第二章(设计原则-SOLID)
前言:SOLID 原则并非单纯的 1 个原则,而是由 5 个设计原则组成的,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,依次对应 SOLID 中的 S、O、L、I、D 这 5 个英文字母。一、单一职责原则(SRP) 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP。一个类或者模块只负责完成一个职责(或者功能)。单一职责原则是为了实现代码高内聚、低耦合,提高代码的复用性、可读性、可维护性。单一职责原则通过...原创 2021-03-30 15:30:37 · 164 阅读 · 0 评论 -
设计模式系列-第一章(设计思想之面向对象)
一、面相对象的四大基本特征封装 关于封装特性封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。它需要编程语言提供权限访问控制语法来支持,例如 Java 中的 private、protected、public 关键字。封装特性存在的意义,一方面是保护数据不被随意修改,提高代码的可维护性;另一方面是仅暴露有限的必要接口,提高类的易用性。 抽象 关于抽象特性,封装主要讲如何隐藏信息、保护数据,那抽象就是讲如何隐藏方法的具体实现,让...原创 2021-03-30 15:06:30 · 125 阅读 · 1 评论