Go 实现常用设计模式(九)代理模式

代理模式 (proxy)

意图:
代理模式为另一个对象提供一个替身或者占位符以控制对这个对象的访问

关键代码:
代理类和被代理类实现同一接口,代理类中持有被代理类对象

应用实例:

  1. 火车票的代理售票点。代售点就是代理,它拥有被代理对象的部分功能—售票功能
  2. 明星的经纪人,经纪人就是代理,负责为明星处理一些事务。

Go实现代理模式

package proxy

import "fmt"

type Seller interface {
    sell(name string)
}

// 火车站
type Station struct {
    stock int //库存
}

func (station *Station) sell(name string) {
    if station.stock > 0 {
        station.stock--
        fmt.Printf("代理点中:%s买了一张票,剩余:%d \n", name, station.stock)
    } else {
        fmt.Println("票已售空")
    }

}

// 火车代理点
type StationProxy struct {
    station *Station // 持有一个火车站对象
}

func (proxy *StationProxy) sell(name string) {
    if proxy.station.stock > 0 {
        proxy.station.stock--
        fmt.Printf("代理点中:%s买了一张票,剩余:%d \n", name, proxy.station.stock)
    } else {
        fmt.Println("票已售空")
    }
}

测试用例

package proxy

import "testing"

func TestProxy(t *testing.T) {

    station := &Station{3}
    proxy := &StationProxy{station}
    station.sell("小华")
    proxy.sell("派大星")
    proxy.sell("小明")
    proxy.sell("小兰")
}

具体代码

更详细的代码可参考:https://github.com/pibigstar/go-demo 里面包含了 Go 常用的设计模式、Go 面试易错点、简单的小项目(区块链,爬虫等)、还有各种第三方的对接(redis、sms、nsq、elsticsearch、alipay、oss...),如果对你有所帮助,请给个 Star,你的支持,是我最大的动力!

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!