设计模式-代理模式(Go语言描述)

标签: go语言 设计模式
6040人阅读 评论(0) 收藏 举报
分类:

大家好, 我是大帅哥,由于最近又变帅了, 所以我决定由我的代理人小帅哥来写这篇博客,不过内容可以放心,还是由我来完成,小帅哥的活就是将我的内容替我发出来罢了。

&_& 还是进入正题吧, 今天这篇博客我们继续来学习设计模式, 在学习了上面几个设计模式之后大家有没有发现设计模式其实很简单, 难道地方是何时选用合适的模式, 这也是设计模式最重要的地方, 不能我们学会的设计模式就可以乱用。 明白就好…… 下面我们就开始介绍一个新的设计模式-代理模式

模式定义

什么是代码模式? 其实文章刚开始的段子并不是寻开心的,其实那就是现实生活中的一个代理模式, 你和我之前通过一个中间人来完成通讯, 其实就这么简单。 虽然简单, 我们还是有必要来看一下人家总结的定义:

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

怎么理解呢? 网上有一个段子解释的很好, 比如你喜欢一个妹子, 不好意思跟人家开口, 这时候你可能就通过她舍友来表达你的爱慕了。 再来看看代理模式的类图吧,通常情况下, 看完定义迷迷糊糊的, 看完类图可能就糊糊的, 等看完代码示例, 就彻底明白了。

从图中可以看到, 代理模式共有4个角色, 其中一个还是抽象的。

  1. Client 就是上面那个段子中的你, 你是行为的主导者。
  2. Subject 是代理人和被代理的抽象接口
  3. RealSubject 被代理的对象, 也就是上面的妹子
  4. Proxy 代理者, 对应上面的妹子室友

不过, 仔细看看类图, 我开始怀疑代理模式的必要性了。 有必要吗? 我直接去调用RealSubject不就行了, 还这么麻烦, 通过一个代理来调用, 这不就是脱了裤子放屁吗? 其实不然, 很多情况下, 真实的对象是我们访问不到的,或者是提供者不想让我们访问到, 这个时候我们就需要一个代理来帮我们完成。举个例子? 很简单, 我们访问一个网站, 数据是不是都放数据库里? 但是网站的提供这不允许我们直接操作数据库, 这个时候就提供了一个页面, 我们通过页面来间接的往数据库里插入数据。

代码演示

好了, 文字的东西不多扯了, 下面我们就用代码来演示一下吧, 在今天我代码中, 我们来模拟一下平时我们使用github的过程,我们在从github上clone项目的时候一般都是通过命令行来完成吧, 其实这个命令行完全可以看作是github的一个代理。

根据上面的类图, 我们首先要提供一个抽象的接口来规范代理和对象的行为

type Git interface {
    Clone(url string) bool
}

ok, 很简单, 只有一个Clone方法,表示我们要从git源来clone项目。 下面我们接着来实现一下真实对象, 也就是Github

type GitHub struct{}

func (p GitHub) Clone(url string) bool {
    if strings.HasPrefix(url, "https") {
        fmt.Println("clone from " + url)
        return true
    }

    fmt.Println("failed to clone from " + url)
    return false
}

GitHub实现了Clone方法, 所以它实现了Git接口,至于Clone方法中的逻辑, 我们就不用关心了, 还有一个重要的角色我们还没看, 来看看代理怎么写吧。

type GitBash struct {
    Gitcmd Git
}

func (p GitBash) Clone(url string) bool {
    return p.Gitcmd.Clone(url)
}

这是我们的命令行, 它持有一个Git类型的变量, 并且他还是先了Clone方法, 我们在调用Clone方法的时候,其实是间接的调用了这个Git类型变量的Clone方法,这就是代理!

还剩下最后一个角色, 那就是我们Coder自己了, 我们自己就随意多了

type Coder struct{}

func (p Coder) GetCode(url string) {
    gitBash := GetGit(1)
    if gitBash.Clone(url) {
        fmt.Println("success")
    } else {
        fmt.Println("failed")
    }
}

GetGit是啥? 其实就是提供者提供给我们的可调用的接口。

func GetGit(t int) Git {
    if t == 1 {
        return GitBash{Gitcmd: GitHub{}}
    }

    return nil // 可能还有其他的git源
}

首先,我们知道我们是要从GitHub上clone项目, 所以我们告诉代理要从GitHub上给我clone项目,别跑GitLab上去了。接下来我们就调用代理的Clone方法,通过前面的代码我们完全可以理解,这里面肯定是调用了GitHubClone方法。 最后我们再来看看运行结果。

完美, 现在理解什么是代理模式了吧。代理模式其实最主要的用途就是当我们无法直接访问一个对象的时候, 通过代理的方式来完成对对象的访问。代理模式具有高扩展性,假如我们需要从GitLab上,只需要提供者添加一个GitLab对象, 然后我们调用GetGit时指定使用GitLab就可以了。

今天的博客很简单,其实模式的代码都是很简单的,不要被设计模式这四个字吓到。 我们6月份再见!

代码放github上了,欢迎star: https://github.com/qibin0506/go-designpattern

查看评论

设计模式-模板方法模式(Go语言描述)

这篇文章我们还是继续我们的设计模式系列, 今天我们带来的一个全新的设计模式在实际开发中大家肯定都遇到过, 可能大家只是不知道它叫模板方法模式而已, 今天我们就来详细的说一下什么是模板方法模式,已经该模...
  • qibin0506
  • qibin0506
  • 2016-06-24 09:05:16
  • 5238

设计模式-策略模式(Go语言描述)

好久没有更新博客了,最近也是在忙着充电,从今天这篇博客开始,我们来了解一下设计模式。设计模式那什么是设计模式呢?首先来看看我从百科上copy下来的概念吧。 设计模式/软件设计模式(Design p...
  • qibin0506
  • qibin0506
  • 2016-01-22 23:49:23
  • 6722

大话设计模式 -- Golang实现

DesignPatternUse GO language to achieve 23 design patterns 该项目是拜读《大话设计模式》后,学习Golang语言实现的,有很多不足之处,有待...
  • aa779025105
  • aa779025105
  • 2017-03-13 11:46:40
  • 1422

设计模式-单例模式(Go语言描述)

这篇博客我们继续来看设计模式,今天带来的是一个最简单而且最常用的模式-单例模式。那什么是单例模式呢?相信大家最它最熟悉不过了,那我们就来快速的了解一下它的定义。 保证一个类仅有一个实例,并提供一个...
  • qibin0506
  • qibin0506
  • 2016-02-24 20:30:18
  • 12933

GO语言HTTP代理服务器

用GO语言实现HTTP代理服务器很简单
  • scybs
  • scybs
  • 2014-07-20 21:48:03
  • 4662

设计模式-装饰者模式(Go语言描述)

什么是装饰者模式好久没有更新设计模式系列的博客了, 今天我们来聊一聊装饰者模式, 用过java的同学肯定对装饰者模式非常熟悉,就算你不知道什么是装饰者模式这概念, 你也一定在代码中经常用到这个模式,为...
  • qibin0506
  • qibin0506
  • 2016-04-07 08:55:07
  • 5488

<em>go</em> <em>设计模式</em>

<em>设计模式</em>-单例模式(<em>Go语言</em>描述) go <em>设计模式</em> 立即下载 上传者: u012389189 时间: 2017-08-11 综合评分: 0 积分/C币:3 Go<em>设计模式</em> 立即下载 上传者: 爱...
  • 2018年04月08日 00:00

go语言: 设计模式-代理模式(Go语言描述)

go语言: 设计模式-代理模式(Go语言描述) 深入Django ORM的继承关系 java: [HackerRank] Diagonal Difference Go: ...
  • daisongwan
  • daisongwan
  • 2016-05-31 10:13:49
  • 183

JAVA设计模式之代理模式

【代理模式应用场景举例】 比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家...
  • jason0539
  • jason0539
  • 2014-04-05 07:07:09
  • 25376

go语言实现设计模式(一):策略模式

策略模式定义了算法家族,在调用算法家族的时候不感知算法的变化,客户也不会受到影响。 下面用《大话设计模式》中的一个实例进行改写。 例:超市中经常进行促销活动,促销活动的促销方法就是一个个策略...
  • yzh900927
  • yzh900927
  • 2015-10-31 22:28:02
  • 765
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 68万+
    积分: 7043
    排名: 4045
    友情链接

    鸿洋_

    Aggie的博客

    梁肖技术中心

    极客导航

    文章分类
    博客专栏
    最新评论