Go 设计模式

设计模式

代理模式

代理模式是在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这个是跟装饰器模式最大的区别。一般情况下,我们让代理类和原始类实现相同的接口,但是如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的,这种情况下,让代理类继承原始类方法来实现代理。

简单的说,实现代理有两个方式:

  • 代理类和原始类实现相同的接口
  • 代理类继承原始类

应用场景

代理模式常用在业务系统开发一些非功能的需求,比如,监控,日志,统计,鉴权,限流,事务,幂等校验等。通过代理的方式,将附加功能和业务功能解耦,放到代理类统一处理,程序员只需要关注业务本身,除此之外,代理模式可以用在 RPC 和缓存等场景中。

代码

proxy.go

package proxy

type Subject interface {
 Do() string
}

type RealSubject struct{}

func (RealSubject) Do() string {
 return "real"
}

type Proxy struct {
 real RealSubject
}

func (p Proxy) Do() string {
 var res string

 // 在调用真实对象之前的工作,检查缓存,判断权限,实例化真实对象等。。
 res += "pre:"

 // 调用真实对象
 res += p.real.Do()

 // 调用之后的操作,如缓存结果,对结果进行处理等。。
 res += ":after"

 return res
}

proxy_test.go

package proxy

import "testing"

func TestProxy(t *testing.T) {
 var sub Subject
 sub = &Proxy{}

 res := sub.Do()

 if res != "pre:real:after" {
  t.Fail()
 }
}

运行结果

=== RUN   TestProxy
--- PASS: TestProxy (0.00s)
PASS

Process finished with exit code 0

参考资料

  • https://github.com/senghoo/golang-design-pattern

本文分享自微信公众号 - 程序员财富自由之路(gh_016ffe40d550),作者:猿星人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go 设计模式-策略模式

    策略模式定义一组算法类,将每个算法分别封装起来,让他们可以相互替换,策略模式可以使得算法独立于客户端,策略模式用来解耦策略的定义,创建,使用。一般来说策略模式也...

    王小明_HIT
  • go设计模式之外观模式

    这篇是设计模式中结构模式的第一篇。微服务架构现在是系统的架构的主流,它将系统拆分成一个个独立的服务,服务之间通过通信建立起关联关系。假设现在有一个博客的系统,它...

    暮雨
  • go设计模式之单例模式

    单例模式在系统设计中很常用,如数据库的连接对象等,该类只有一个实例存在,实现很简单,就是在创建实例时,判断一下,实例是否已经存在。

    暮雨
  • go设计模式之原型模式

    原型在IT领域常被提及,那么什么是原型?就产品设计来举例吧,在产品开发中,产品经理需要根据业务,画出一个产品原型图,然后设计,根据产品原型图画出设计图,前端工程...

    暮雨
  • go设计模式之代理模式

    代理在计算机领域是个经常被提及的名词,如nginx就常被用于webf服务的代理。那么怎么实现代理这种模式?

    暮雨
  • Go 设计模式-建造者模式

    工厂模式用来创建不同、但是类型相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定哪种类型的对象,建造者模式是用来构建一种复杂对象,可以通过设置...

    王小明_HIT
  • Go 设计模式-观察者模式

    观察者模式,也被称为发布订阅模式(Publish-Subscribe Design Pattern)

    王小明_HIT
  • Go 设计模式- 装饰器模式

    装饰器模式主要解决继承关系过于复杂的问题,通过组合来代替继承,给原始类添加增强功能,这也是判断装饰器的一个重要依据,除此之外,装饰器还有一个特点,可以对原始类嵌...

    王小明_HIT
  • go设计模式之建造者模式

    func NewBuilder(build Builder) *Director {

    暮雨
  • go设计模式之简单工厂

    简单工厂是设计模式中最简单的一创建类型模式,通过一个手机的例子,来展示该模式的使用。

    暮雨
  • go设计模式之工厂方法

    在上一篇文章中,实现了简单工厂模式,通过创建一个工厂类,在工厂方法中根据不同的产品类型创建对应的产品实例。当添加一个产品时,需要修改工厂中的创建方法,这种模式不...

    暮雨
  • go设计模式之抽象工厂

    在上一篇文章中,通过手机的例子对工厂方法进行了展开。制造商不单单只生产手机这一种产品,同时也生产pc,如果工厂扩展其它业务,工厂方法模式就不适用了。为了实现工厂...

    暮雨
  • 并发组件 | Go设计模式实战

    之前文章《代码组件 | Go设计模式实战》已经介绍了「组合模式」的概念,以及在业务中的使用。今天我们结合Go语言天生的并发特性,升级「组合模式」为「并发组合模式...

    用户1093396
  • Golang语言情怀-第34期 Go 语言设计模式 模板

    https://www.cnblogs.com/mafeng/p/6924071.html

    李海彬
  • go语言实现设计模式(三):模版模式

    模版模式真的是一个好东西。所谓模版模式,就是说,某几个类中相同的操作和代码提取到父类的一个函数中,并定义相同的操作为抽象函数。由子类来实现。估计我也没表达清楚,...

    超级大猪
  • Golang语言情怀-第18期 Go 语言设计模式-单利模式

    缺点:非协程安全。当正在创建时,有协程来访问此时ins = nil就会再创建,单例类就会有多个实例了。

    李海彬
  • Golang语言情怀-第16期 Go 语言设计模式 工厂模式

    因为这里的Student 的首字母S是大写的,如果我们想在其它包括创建Student 的实例(比如main包),引入model 包后,就可以直接创建Studen...

    李海彬
  • Golang语言情怀-第40期 Go 语言设计模式 信号

    实际项目中,我们希望修改了配置文件后,但又不想通过重启进程让它重新加载配置文件,可以使用signal的方式进行信号传递,或者我们希望通过信号控制,实现一种优雅的...

    李海彬
  • Golang语言情怀-第20期 Go 语言设计模式-桥接

    适用性 以下情况适合使用桥接模式: .不希望在抽象和它的实现部分之间有一个固定的绑定关系。比如这种情况可能是因为在程序运行时刻实现部分应可以被选择或者切换。 ....

    李海彬

扫码关注云+社区

领取腾讯云代金券