golang 设计模式
文章平均质量分 87
用go语言来实现设计模式,一边学习设计模式,一边熟悉golang
tanhao1410
这个作者很懒,什么都没留下…
展开
-
golang与java备忘录模式
1.定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。2.理解备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。比如有IE 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作。3.角色发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘原创 2020-09-14 09:28:55 · 73 阅读 · 0 评论 -
golang与java访问者模式
1.定义将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。2.理解有些集合对象中存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。电影或电视剧中的人物角色,不同的观众对他们的评价也不同;还有顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收银员关心的是商品的价格和数量。3.组成抽象原创 2020-09-11 10:23:48 · 109 阅读 · 0 评论 -
golang与java适配器模式
1.定义将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。2.理解在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。3.组成目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。适配者(Adaptee)类:它是被访问和适配的现原创 2020-09-10 10:15:03 · 106 阅读 · 0 评论 -
golang与java装饰模式
1.定义在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。2.理解通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。与代理模式相比,代理模式扩展的功能仅限于接口中原有的方法,不会增加新的方法,而装饰模式可以做到。代理模式中,调用方直接调原创 2020-09-09 10:57:16 · 70 阅读 · 0 评论 -
golang与java桥接模式
1.定义将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。2.理解只看名称和定义这个桥接模式还是不好理解,用组合关系代替继承关系听起来和桥接好像没什么关联。当一个类有很多种维度的类型时,如果都采用继承的方式,会发现,子类的数量将会非常庞大。这个时候,我们可以将各种维度的类型给抽取出来,然后通过组合的方式加入到类中。即桥接模式用来解决的是某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。不同品牌和功率的汽车、不同性别和职原创 2020-09-08 10:36:43 · 148 阅读 · 1 评论 -
golang与java观察者模式
1.定义指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。2.理解在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心。下面的代码例子为,报纸发布了一个文章后,所有注册了该报纸的读者都能够 读到内容。3.构成观察者模式的主要角色如下。抽象主题(Subje原创 2020-09-07 13:58:40 · 86 阅读 · 0 评论 -
golang与java组合模式
1.定义又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。2.理解可以简单理解为树状结构,访问树中的任何一个节点和访问树是同样的操作。组合模式包含以下主要角色。抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。树叶构件(Lea原创 2020-09-04 12:36:04 · 808 阅读 · 0 评论 -
golang与java 中介者模式
1.定义定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。2.理解就像在现实中一样,我们想要和身边的人通信,我们需要知道他的联系方式,直接和他通信。当系统中,对象比较多时,这种方式就非常不方便了。通过中介者,我们只需要将要传达的信息交给中介者就好,中介者会将该信息传递给所有注册到中介者的对象上。将原本多对多的关系转化成了多对一。所有的对象只需要关心中介者的存在即可。3.结构中介者模式包含以下主要角色。抽象中介者(Mediator)角色:它是中原创 2020-09-03 14:36:03 · 127 阅读 · 0 评论 -
golang与java 迭代器模式
1.定义提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。主要包括以下几个角色:抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定原创 2020-09-02 11:15:22 · 169 阅读 · 0 评论 -
golang 模板方法
1.定义定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。2.理解模板方法模式是结构比较简单的设计模式了,简单来说,就是抽象的父类中定义一系列确定的步骤,而将无法确定的步骤放入到具体实现子类中。还有个好处就是在父类中提取所有子类的公共的部分代码,便于代码复用。3.示例java中,支持抽象类,因此该模式很容易写,先用java来写一个样例,然后用golang的组合来模仿:java:public class TemplateP原创 2020-09-01 14:21:06 · 650 阅读 · 0 评论 -
golang 享元模式
一、定义运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。二、理解在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。比如,在围棋中的白子和黑子,各个对象很相似,如果为每一个对象都重新生成一个对象,会造成资源的浪费。享元模式就是将大量对象共有的部分抽取出来,供这些对象共享使用。而这些元素不同的部分,会以参数的形式注入具体享元的相关方法中。在享元模式中,有以下几种角色:抽象享元角原创 2020-08-31 14:22:10 · 239 阅读 · 0 评论 -
golang 外观模式
一、定义一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。主要是定义了一个高层接口。它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。现在来分析其基本结构和实现方法。二、理解外观角色为系统提供一个统一的访问入口,客户端如果要访问系统的某个功能,可以不用直接去找子系统,而是通过该外观角色去完成该功能。这样,当一个系统中有很多子模块时原创 2020-08-28 09:13:51 · 121 阅读 · 0 评论 -
golang 工厂模式与抽象工厂模式
一、工厂模式 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。 工厂模式算是一个比较简单的模式了,简单理解就是,创建对象的工作交给工厂即可,客户端不用关心对象怎么来的,直接从工厂获得即可,类似于spring 的IOC。 工原创 2020-08-27 09:28:34 · 437 阅读 · 0 评论 -
golang 建造者模式
一、定义在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。产品都是由多个部件构成的,各个部件可以灵活选择,但其创建步骤都大同小异。将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。二、理解其实学习每一个设计模式都不难,难的是在于找到它的应用之处,以及各种模式间的区别在原创 2020-08-26 09:43:14 · 269 阅读 · 0 评论 -
golang 原型模式与原型模式的扩展
一、定义用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。二、最简单的原型模式原型模式即通过复制原型对象创建一个和原型相同的或相似的对象,因此,我们可以给类(struct)增加一个方法,Clone()来返回对象的复制品即可,代码如下:可以看到通过调用Clone生成了一个和原来一样的一个对象。func main1() { person1 := new(Person) person1.Age = 12 person1.Nation = "China" perso原创 2020-08-25 10:24:58 · 265 阅读 · 0 评论 -
golang 状态模式
定义状态模式把受环境改变的对象行为包装在不同的状态对象里,其意图是让一个对象在其内部状态改变的时候,其行为也随之改变。现在我们来分析其基本结构和实现方法。状态模式包含以下主要角色。环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。具体状态(Concrete State)角色:实现抽象状态所对应的行为。理解对象(即上文中原创 2020-08-24 12:37:12 · 363 阅读 · 0 评论 -
golang 单例模式-三种实现形式
定义单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式,可以看到定义简单,算是设计模式中最简单的一个模式了。饿汉模式即还未使用该对象时,对象已经创建完成。方法是通过golang 的init函数,在导包时就自动执行。package mianimport "fmt"var instanse *singlertype singler struct { Name string}func NewSingler()*singler{ retur原创 2020-08-21 09:06:32 · 855 阅读 · 1 评论 -
golang 命令模式
概念命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。理解设计模式有很多种,这些模式之前有些很相似,策略模式和命令模式就非常相似。为了更好的理解,我们先看策略模式,客户端通过给context传递不同的策略方法类,则context执行不同的策略。如果,我们把命令模式中的接受者去掉,会发现,策略模式和命令模式如出一辙,仅仅是名称改了一下。在命令模式中,相当于把c原创 2020-08-20 10:23:06 · 333 阅读 · 0 评论 -
golang 责任链模式
责任链模式定义责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。我的理解举个例子,在HTTP请求过来时,会有多个处理这进行处理,比如权限验证处理,日志处理,业务 处理等等。如果采用非职责链模式的话,我们客户端,会调用权限处理模块、日志 处理模块等去处理该请求,即定义中说的与多个请求矗立着耦合在一起。采用责任链原创 2020-08-19 10:05:34 · 615 阅读 · 0 评论 -
golang 策略模式与策略工厂模式
什么是策略模式策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。什么是策略工厂模式在一个使用策略模式的系统中,当存在的策略很多时,客户端管理所有策略算法将变得很复杂,如果在环境类中使用策略工厂模式来管理这些策略类将大大减少客户端的工作复杂度代码在下面的代码中,分别用策略模式和策略工厂模式实原创 2020-08-18 09:29:28 · 978 阅读 · 0 评论 -
golang 代理模式
golang 代理模式什么是代理模式和装饰模式的区别功能例子golang代码什么是代理模式在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。和装饰模式的区别听起来和装饰模式很想,装饰模式也扩展了原有对象的功能,区别在于,装饰模式,需要客户端自己创建原功能类,就像java中的普通的InputStream,通过装饰模式包装成FileInputStream等。但是代理区别在于,客户端不会看到被代理的对象,被代理对象的存在完全被中介隔离了。功能原创 2020-08-17 12:00:48 · 217 阅读 · 0 评论