• 《Go设计模式》

  • 价格:免费
  • 状态:全书已完结
  • 在读人数:24
  • 热度:1335
创建者
  • 那场梦
  • 18 粉丝 40博客
内容简介

关于设计模式的书很多,但用Go语言去实现的并不多见。本书是23种常见设计模式的Go语言实现版,希望对于那些Go语言的学习者有所帮助。




章节目录
  • 第一章 创建型设计模式
  • 1.1 单例模式
  • 单例模式单例模式采用了 饿汉式 和 懒汉式 两种实现,个人其实更倾向于饿汉式的实现,简单,并且可以将问题及早暴露,懒汉式虽然支持延迟加载,但是这只是把冷启动时间放到了第一次使用的时候,并没有本质上解决问题,并且为了实现懒汉式还不可避免的需要加锁。饿汉式 代码实现: package singlet
  • 1.2 工厂模式和DI容器
  • 简单工厂 由于 Go 本身是没有构造函数的,一般而言我们采用 NewName 的方式创建对象/接口,当它返回的是接口的时候,其实就是简单工厂模式 package factory// IRuleConfigParser IRuleConfigParser type IRuleConfigParser
  • 1.3 建造者模式
  • 其实在 Golang 中对于创建类参数比较多的对象的时候,我们常见的做法是必填参数直接传递,可选参数通过传递可变的方法进行创建。本文会先实现课程中的建造者模式,然后再实现我们常用的方式。建造者模式 代码 通过下面可以看到,使用 Go 编
  • 1.4 原型模式
  • 这个模式在 Java、C++ 这种面向对象的语言不太常用,但是如果大家使用过 javascript 的话就会非常熟悉了,因为 js 本身是基于原型的面向对象语言,所以原型模式在 js 中应用非常广泛。接下来会按照一个类似课程中的例子使用深拷贝和浅拷贝结合的方式进行实现 需求: 假设现在数据库
  • 1.5 小结
  • 耗时 2 周更新完了创建型的设计模式,回头思考一下,学习设计模式我们关注的是什么,如何实现么?是也不是。我认为比了解如何实现设计模式更重要的是这些设计模式的应用场景,什么场景下我们该用这种设计模式;以及这些设计模式所包含的思想,最终帮助我们把代码写“好”,可以帮助我们满足一系
  • 第二章 结构型设计模式
  • 2.1 代理模式
  • 接下来会通过 golang 实现静态代理,有 Golang 和 java 的差异性,我们无法比较方便的利用反射实现动态代理,但是我们可以利用** go generate **实现类似的效果,并且这样实现有两个比较大的好处,一个是有静态代码检查,我们在编译期间就可以及早发现问题,第二个是性能会更好。静态代理 代码: pa
  • 2.2 桥接模式
  • 代码实现:package bridge// IMsgSender IMsgSender type IMsgSender interface {Send(msg string) error }// EmailMsgSender 发送邮件 // 可能还有 电话、短信等各种实现 type EmailMsgSender struct {e
  • 2.3 适配器模式
  • 代码实现 假设我现在有一个运维系统,需要分别调用阿里云和 AWS 的 SDK 创建主机,两个 SDK 提供的创建主机的接口不一致,此时就可以通过适配器模式,将两个接口统一。 PS:AWS 和 阿里云的接口纯属虚构,没有直接用原始的
  • 2.4 装饰器模式
  • 代码实现 下面是一个简单的画画的例子,默认的 Square 只有基础的画画功能, ColorSquare 为他加上了颜色 package decorator// IDraw IDraw type IDraw interface {Draw() string }// Square 正方形 type Square struc
  • 2.5 门面模式
  • 代码实现 假设现在我有一个网站,以前有登录和注册的流程,登录的时候调用用户的查询接口,注册时调用用户的创建接口。为了简化用户的使用流程,我们现在提供直接验证码登录/注册的功能,如果该手机号已注册那么我们就走登录流程,如果该手机号未注册,那么我们就创建一个新的用户。 code package
  • 2.6 组合模式
  • 代码实现 公司的人员组织就是一个典型的树状的结构,现在假设我们现在有部分,和员工,两种角色,一个部门下面可以存在子部门和员工,员工下面不能再包含其他节点。 我们现在要实现一个统计一个部门下员工数量的功能 Code package composite// IOrganization 组织接口,都实现统计人数的功能 ty
  • 2.7 亨元模式
  • 代码实现 复用课程中的 🌰,如果我们现在正在做一个棋牌类的游戏,例如象棋,无论是什么对局,棋子的基本属性其实是固定的,并不会因为随着下棋的过程变化。那我们就可以把棋子变为享元,让所有的对局都共享这些对象,以此达到节省内存的目的。
  • 第三章 行为型设计模式
  • 3.1 观察者模式
  • 代码实现 基础实现 Code package observer import "fmt" // ISubject subject type ISubject interface {Register(observer IObserver)Remove(observer IObserver)Notify(msg string) }
  • 3.2 模板模式
  • 代码实现 举个 🌰,假设我现在要做一个短信推送的系统,那么需要: 1.检查短信字数是否超过限制 2.检查手机号是否正确 3.发送短信 4.返回状态 我们可以发现,在发送短信的时候由于不同的供应商调用的接口不同,所以会有一些实现上的差
  • 3.3 策略模式
  • 代码实现 来个 🌰,我们在保存文件的时候,由于政策或者其他的原因可能需要选择不同的存储方式,敏感数据我们需要加密存储,不敏感的数据我们可以直接明文保存。 Code package strategyim
  • 3.4 职责链模式
  • 代码实现 首先我们看一下一个简单的实现模板,然后我们再看看实际上我们常用 web 框架 gin 当中是如何处理请求的 Code // Package chain 职责链模式 // 🌰 假设我们现在有个校园论坛,由于社区规章制度、广告、法律法规的原因需要对用户的发言进行敏感词过滤 //
  • 3.5 状态模式
  • 代码实现 通过下面的例子可以发现,引入状态模式来写状态机会有引入比较多的结构体,并且改动代码的时候如果要新增或者是删除某一个状态的话,修改也需要在其他状态的结构体方法中修改,所以这个不太适合状态经常变更或者是状态很多的情况C
  • 3.6 迭代器模式
  • 代码实现 下面是一个简单的自定义数组类型的例子 Code package iterator// Iterator 迭代器接口 type Iterator interface {HasNext() bo
  • 3.7 访问者模式
  • 代码实现 原课程中讲解访问者模式的时候用到了继承和函数重载这两个 Go 中没有的特性,接下来的呢,会通过继承实现。 注意由于没有函数重载,所以我们并不知道传递过来的对象是什么类型,这个时候只能采用类型断言的方式来对不同的类型做不同的操作,但是正式由于没有函数重载,所以其实完全可以不用访问
  • 3.8 备忘录模式
  • 代码实现 Code // Package memento 备忘录模式 // 下面这个例子采用原课程的例子,一个输入程序 // 如果输入 :list 则显示当前保存的内容 // 如果输入 :undo 则删除上一次的输入 // 如果输入其他
  • 3.9 命令模式
  • 代码实现 接下来会有两个例子,第一个是按照原文定义的方式,将函数封装成对象,第二个例子我们直接将函数作为参数传递。将函数封装为对象 Code // Package command 命令模式 // 这是示例一,采用将函
  • 3.10 解释器模式
  • 代码实现 Code // Package interpreter 解释器模式 // 采用原课程的示例, 并且做了一下简化 // 假设我们现在有一个监控系统 // 现在需要实现一个告警模块,可以根据输入的告警规则来决定是否触发告警 // 告警规则支持 &&、>、<
  • 3.11 中介模式
  • 代码实现 Code // Package mediator 中介模式 // 采用原课程的示例,并且做了一些裁剪 // 假设我们现在有一个较为复杂的对话框,里面包括,登录组件,注册组件,以及选择框 // 当选择框选择“登录”时,展示登录相关组件 //
  • 总结(全书完)
  • 原本预计是在八月底更新完毕这个系列,到今天是 11-05,晚了几天,不过也还好,这是第一次这么密集的去更新博客上的内容,更多的是以笔记的形式来呈现,加上这篇一共 24 篇文章差不多两个半月的时间,平均每周输出两篇,感觉还是
读者评论
  • 你还没登录,点击这里
  • 本书评论
最近这些人在读这本书