go语言设计模式
文章平均质量分 60
背帆
你从容不迫地奔跑而去,就连这么漫长迷茫的前程都不畏惧。
展开
-
行为型设计模式—备忘录模式
Editor实现,Undo、Redo方法即回退、前进方法在实现的时候就是依赖的它内部记录的一组Memento对象,通过指向不同的Memento对象来实现回退和前进功能。即利用快照的思想实现对象的版本更替。Caretaker(管理人):Caretaker是保存着多条备忘录的对象,并维护着备忘录的索引,在需要的时候会返回相应的备忘录 – 类比理解为博客系统中的编辑器对象。Originator(发起者):Originator是当前的基础对象,它会将自己的状态保存进备忘录,此角色可以类比博客系统中的文章对象。原创 2024-02-06 15:02:54 · 1042 阅读 · 0 评论 -
行为型设计模式—中介者模式
机场的控制塔是一个典型的中介者角色, 飞机在起飞和降落前都会向控制塔发出问询,控制塔会给飞机发送指令协调它们的起飞降落时间,避免造成事故。中介模式与观察者模式在结构上有些相似,观察者模式中的EventDispatcher 和 中介模式中的 Mediator 看起来很想,都是把多个组件之间的关系,维护到自身,实现组件间的间接通信达到解构效果。方法里都会去跟作为中介者的指挥塔发出问询,看是否能够降落,如果跑道正在被占用,那么会等待指挥塔调用它自己的。而其他占用跑道的飞机在起飞后会通过中介者提供的。原创 2024-02-05 17:30:08 · 1052 阅读 · 0 评论 -
行为型设计模式—解释器模式
实现一个加减的运算器,我们对每种运算定义对应的Expression对象,在方法里实现具体的运算规则,避免所有的运算操作放到一个函数中,这体现了解释器模式的核心思想,将语法解析的工作拆分到各个小类中,以此来避免大而全的解析类。解释器模式:用来在程序里创建针对一个特点领域语言的解释器,用于处理解释领域语言中的语句。在更高级的情况下,解释器模式可用于解析和解释自然语言,不过这通常会涉及想机器学习这样的更复杂的技术。创建一个表达式解析器,它会根据输入表达式构造抽象语法树,使用创建的抽象语法树和上下文解释表达式。原创 2024-02-05 17:29:22 · 348 阅读 · 0 评论 -
行为型设计模式—命令模式
命令模式作用可以类比于一个场景—在市中心逛了很久的街后, 你找到了一家不错的餐厅, 坐在了临窗的座位上。命令模式:它通过将请求封装为一个独立的对象即命令对象,来解耦命令的调用者和接收者,使得调用者和接收者不直接交互。在这种情况下, 命令用于对目标对象执行各种不同的操作, 备忘录用来保存一条命令执行前该对象的状态。通过命令模式,我们把PS5抽象成命令发送者、CPU对象作为执行业务逻辑的命令接收者,然后引入引入Command 接口把两者做解耦,来满足开闭原则。假设PS5的CPU支持A、B、C三个命令操作,原创 2024-01-31 10:25:52 · 793 阅读 · 0 评论 -
行为型设计模式—访问者模式
访问者模式通过将算法与对象结构分离来工作,这里说的算法指的是对对象的操作。该接口将为对象结构中的每个类(一般称为元素类)提供一个方法。当Accpet方法被调用时,访问者实例对应的方法就会被调用,通过访问者完成对元素类实例的操作。有点像迭代器模式的结构,可以把迭代器看成访问者模式的特例,迭代器是吧遍历操作与具体数据结构解耦,而访问者模式把任何操作与一类对象解耦。访问者模式:将数据结构对象与数据操作分离的设计模式,可以在不改变数据结构对象类结构的前提下定义作用于这些对象的新的操作。接受方法添加至形状接口中。原创 2024-01-31 10:25:04 · 611 阅读 · 0 评论 -
行为型设计模式—迭代器模式
迭代器模式:也叫作游标模式,能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。在迭代器的帮助下, 客户端可以用一个迭代器接口以相似的方式遍历不同集合中的元素。迭代器模式在平时编程的时候使用的并不多,像Java、C#编程时都自带了迭代器模式的实现,也支持实现语言内置的。接口来给自定义集合创建迭代器。原创 2024-01-30 18:36:50 · 624 阅读 · 0 评论 -
行为型设计模式—状态模式
当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式,把特定于状态的代码抽象到一组独立的状态类中避免过多的状态条件判断,减少维护成本。状态实现类在内部确定了状态可以转换的下个状态,这样就把系统流程的状态机留在了内部,避免让客户端代码再去做状态链初始化和转换的判断,符合高内聚的设计原则,从而解放了客户端。首先针对交通红绿灯,每种灯状态下都有亮灯、变灯、测速的行为,首先定义出交通灯的状态接口。主要由环境类角色、抽象状态角色和具体状态角色,三个角色构成。原创 2024-01-13 09:42:50 · 549 阅读 · 0 评论 -
行为型设计模式—职责链模式
即能为请求创建一条由多个处理器组成的链路,每个处理器各自负责自己的职责,相互之间没有耦合,完成自己任务后请求对象即传递到链路的下一个处理器进行处理。这也是职责链跟装饰器模式的一个区别,装饰器模式无法在增强实体的过程中停止,只能执行完整个装饰链路。职责链模式与模板模式的区别在于,模板模式的业务流程通常是规定不变的,而职责链模式业务是可拓展的。方法的参数都是流程中要处理的请求。利用责任链模式,实现这个流程中的每个步骤,且相互间不耦合,还支持向流程中增加步骤。定义职责链要处理的请求,实现处理逻辑和请求传递的。原创 2024-01-13 09:41:28 · 566 阅读 · 0 评论 -
行为型设计模式—策略模式
策略模式与模板模式解耦维度不同,策略模式是让完成某个任务的具体方式可以相互切换,而模版模式则是针对一个流程的共性梳理出固定的执行步骤,二者经常配合使用。策略模式:定义一类算法族,将每个算法分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户端。有了策略的实现后,还要上下文来协调,以及持有完成这个任务所必需的那些入参。下面使用策略模式实现一个支付功能的支付策略。参考公众号网管叨bi叨。原创 2024-01-10 10:45:28 · 341 阅读 · 0 评论 -
行为型设计模式—模板模式
模版模式惯常的用法是,在一个方法模版方法中定义一个算法或者逻辑的流程和步骤,比如先调内部的方法A 再调内部方法B,满足某个条件了不调方法 C 等等,而这个流程中每个步骤对应的方法都可以推迟到子类中去实现,这就给了程序在不改变大流程、步骤的情况下,完成相似性业务的能力。银行柜台办理业务,存款、取款、购买理财等这些业务的流程中都会有:取号、排位等号、处理业务、服务评价这几个步骤,如果你是金葵花之类的VIP用户,有可能有专属窗口不用排队,检查用户是不是VIP这样步骤叫做钩子方法。参考公众号网管叨bi叨。原创 2024-01-10 10:43:59 · 596 阅读 · 0 评论 -
行为型设计模式—观察者模式
观察者模式:订阅(Publish/Subscribe)模式,定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知,依赖对象在收到通知后,可自行调用自身的处理程序,实现想要干的事情,比如更新自己的状态。观察者模式的订阅是在事件类中添加自己的事件函数,而发布是事件改变时,事件类遍历自己存储的所有事件函数逐一执行。观察者模式主要是用来实现事件驱动编程。事件驱动编程的应用广泛,除了能用来解耦:用户修改密码后,给用户发短信进行风险提示之类的典型场景。参考公众号网管叨bi叨。原创 2024-01-08 12:04:23 · 553 阅读 · 0 评论 -
建造型设计模式—桥接模式
如果用常规的继承来实现这个数据库导出模块,模块中首先要有一个类似抽象基础类的基类,然后再用继承分别实现:MySQL-CSV导出类、MySQL- JSON导出类、Oracle-CSV导出类、Oracle-JSON导出类,如果以后模块再加一种支持的数据库SQLServer和导出格式XML,那么系统里实现类就更多了。如果有N个维度,每个维度有M种变化,则最少需要M * N个实现类,类非常多,并且实现类中有非常多的重复功能。的引用,即通过组合的方式来完成我们的数据导出器在导出格式和数据源类型两个维度上的自由搭配。原创 2024-01-08 12:03:08 · 392 阅读 · 0 评论 -
建造型设计模式—外观模式
外观模式为子系统中的功能接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这些子系统更加容易使用。把电脑拥有的CPU、RAM内存和硬盘视为子系统,调用方想启动电脑要启动这三个子系统,所以在子系统上增加一个外观对象,让调用方直接调用外观对象,由外观对象再分别对接子系统最终完成电脑的启动。外观模式的优点外观模式的缺点。原创 2024-01-05 10:49:56 · 301 阅读 · 0 评论 -
建造型设计模式—享元模式
享元可以理解为可复用的对象,即可以是对象级别的复用,也可以是对象的字段进行复用(把可复用的字段单独提炼成一个更精细的对象)。节省内存的前提是享元对象是不可变对象,不可变对象指的是初始化之后,对象的状态不会改变了,也就是不会存在被修改的情况。如果在平台中每创建一个牌局就需要初始化对应的卡牌,这样显然很浪费,因为一套扑克牌里的卡牌是固定的,不管多少个牌局使用的扑克牌都是一样的,扑克牌在这里就相当于不可变对象,创建后即不可改变。享元模式的优点是能减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率。原创 2024-01-05 10:46:55 · 339 阅读 · 0 评论 -
结构型设计模式—组合模式
组合模式:通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性首先定义一个组织的行为接口,这个接口大到总公司小到一个部门都得实现:接口里提供两个方法,一个是打印出自己的组织结构的方法display()另外一个是展示组织职责的方法duty()。定义和实现组合对象组合对象用来表示有下属部门的组织,在代码里可以看到,它持有一个类型的列表,这里存放的是它的下属组织。组合对象的displayduty。原创 2024-01-04 08:51:30 · 371 阅读 · 0 评论 -
结构型设计模式—适配器模式
项目使用第三方类库的时候,防止未来有更换同等功能类库的可能,一般会推荐使用适配器模式对三方类库做一层封装,这样未来需要用同等功能的服务类进行替换时,实现一个新的适配器包装服务类即可,不需要对已有的客户端代码进行更改。使用适配器模式,在项目中接入依赖库,这样以后需要替换成其他同等功能的依赖库的时候,不会影响到项目中的通过适配器使用依赖库功能的代码。客户端在使用Cache时,是直接用Cache接口中定义的方法跟适配器交互,由适配器再去转换成对三方依赖库。的调用完成Redis操作。参考公众号网管叨bi叨。原创 2024-01-02 15:01:09 · 804 阅读 · 0 评论 -
结构型设计模式—装饰器模式
但装饰器的使用必将会给程序带来更高的复杂性,更低的可读性,子类集成的代码结构会更直白易懂一些,而且虽然装饰器符合“开闭原则”,但是它会给程序带来更多的类,动态装饰在多层装饰时会更复杂,对于大型项目来说也是更好维护,我最近写一个项目就是,实现原型后要对基础Entry类进行更加具体的拓展,这无疑要对代码进行重构,后续可能进一步升级项目功能,那就需要不断重构,使用装饰器模式可以使代码健壮性良好,有利于进一步维护。在包装器中进行我们代码的扩展,有助于重用功能并且不会修改现有对象的代码,符合“开闭原则”。原创 2024-01-01 08:52:13 · 514 阅读 · 0 评论 -
建造型设计模式-原型模式
这里的“零成本”说的是,调用者啥都不用干,干等着,原型对象在 Clone 方法里自己克隆出自己,给到调用者,所以按照这个约定所有原型对象都要实现一个 Clone 方法。原型对象按照惯例,会暴露出一个 Clone 方法,给外部调用者一个机会来从自己这里“零成本”的克隆出一个新对象。:通过复制、拷贝或者叫克隆已有对象的方式来创建新对象的设计模式叫做原型模式,被拷贝的对象也被称作原型对象。使用原型模式的目的主要是为了节省创建对象所花费的时间和资源消耗,提升性能。参考公众号网管叨bi叨。原创 2023-12-31 09:33:53 · 356 阅读 · 0 评论 -
结构型设计模式—代理模式
代理模式:进行逻辑处理的原对象通常被称作服务对象,代理跟服务对象实现相同的接口,控制原对象的访问,并允许在将请求提交原对象前后进行处理,从而增强原对象的逻辑处理。方法的调用委托(英文术语叫delegate)给其 vehicle 属性的 Drive 方法,并在之前添加年龄检查行为,从而达到想要的效果。Car 需要实现一个代表驾驶行为的接口(interface)Vehicle,该接口只有一个方法。字段显然是不合理的。,再一个包装 Driver 和 Vehicle 类型的包装类型。行为时,加上驾驶员的年龄限制。原创 2023-12-31 09:35:43 · 379 阅读 · 0 评论 -
建造型设计模式-建造者模式
使得同样的构建过程可以创建不同的表示。构建的对象很大并且需要多个步骤时,使用构建器模式,有助于减小构造函数的大小。把一个整体的构造函数分解成各个属性的构造函数,并在各个构造函数上都加上审查。假设有很多很多属性,那么构造函数会很大。使用建造者创建构造函数如下。假如需要创建一个DB连接池类。一种对象构建模式,是将。原创 2023-12-29 17:04:10 · 588 阅读 · 0 评论 -
go语言设计模式-工厂模式
根据条件对外提供创建不同的类。仿佛根据顾客要求,工厂生产不同的产品。Go 语言没有构造函数,一般会定义 NewXXX 函数来初始化相关类。NewXXX 函数返回接口时就是简单工厂模式。一个简单的应用场景,这个应用场景里会提供很多语言的打印机,他们都源于一个 Printer 接口。程序通过简单工厂向客户端提供需要的语种的打印机。目前这个场景里我们先提供两个语种的打印机,他们都是 Printer 接口的具体实现类型。客户端只需要告诉工厂想要哪个语种的打印机产品,工厂就会把产品给返回给客户端。原创 2023-12-29 11:36:20 · 731 阅读 · 0 评论 -
go语言设计模式-单例模式
即把实例的访问进行收口,不能谁都能 new 类,所以单例模式还会提供一个2访问该实例的全局端口,一般都会命名个。是用来控制类型实例的数量的,当需要确保一个类型只有一个实例时,就需要使用单例模式。懒汉模式是延迟加载的模式,适合程序执行过程中条件成立才创建加载的类型实例。饿汉模式适用于系统初始化时创建已经确定的类型实例,如数据库实例。要考虑并发环境下,判断实例是否已经创建时,是不是用的当前读。由创造但单例的时间,单例模式分为。使用go语言的init函数实现。之类的函数用作实例访问的端口。原创 2023-12-29 11:32:58 · 560 阅读 · 0 评论