美文网首页
【Go 精选】设计模式 - 代理、适配器和装饰器模式

【Go 精选】设计模式 - 代理、适配器和装饰器模式

作者: 熊本极客 | 来源:发表于2023-04-16 19:19 被阅读0次

1.代理模式

代码

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
}

测试用例

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

2.适配器模式

代码

package adapter

//Target 是适配的目标接口
type Target interface {
    Request() string
}

//Adaptee 是被适配的目标接口
type Adaptee interface {
    SpecificRequest() string
}

//AdapteeImpl 是被适配的目标类
type adapteeImpl struct{}

//SpecificRequest 是目标类的一个方法
func (*adapteeImpl) SpecificRequest() string {
    return "adaptee method"
}

//NewAdaptee 是被适配接口的工厂函数
func NewAdaptee() Adaptee {
    return &adapteeImpl{}
}

//Adapter 是转换Adaptee为Target接口的适配器
type adapter struct {
    adaptee Adaptee
}

//Request 实现Target接口
func (a *adapter) Request() string {
    return a.adaptee.SpecificRequest()
}

//NewAdapter 是Adapter的工厂函数
func NewAdapter(adaptee Adaptee) Target {
    return &adapter{adaptee}
}

测试用例

package adapter

import "testing"

var expect = "adaptee method"

func TestAdapter(t *testing.T) {
    adaptee := NewAdaptee()
    target := NewAdapter(adaptee)
    res := target.Request()
    if res != expect {
        t.Fatalf("expect: %s, actual: %s", expect, res)
    }
}

// === RUN   TestAdapter
// --- PASS: TestAdapter (0.00s)
// PASS

3.装饰器模式

代码

package decorator

type Component interface {
    Calc() int
}

type ConcreteComponent struct{}

func (*ConcreteComponent) Calc() int {
    return 0
}

type MulDecorator struct {
    Component
    num int
}

func (d *MulDecorator) Calc() int {
    return d.Component.Calc() * d.num
}

func WarpMulDecorator(c Component, num int) Component {
    return &MulDecorator{
        Component: c,
        num:       num,
    }
}

type AddDecorator struct {
    Component
    num int
}

func (d *AddDecorator) Calc() int {
    return d.Component.Calc() + d.num
}

func WarpAddDecorator(c Component, num int) Component {
    return &AddDecorator{Component: c, num: num}
}

测试用例

package decorator

import "fmt"

func ExampleDecorator() {
    var c Component = &ConcreteComponent{}
    c = WarpAddDecorator(c, 10)
    c = WarpMulDecorator(c, 8)
    res := c.Calc()

    fmt.Printf("res %d\n", res)
}

相关文章

  • 【设计模式】结构型设计模式汇总

    结构型设计模式汇总 结构型设计模式名称 结构型设计模式主要包括 7 大类: 代理模式 桥接模式 装饰器模式 适配器...

  • 8种设计模式:

    主要介绍 单例设计模式,代理设计模式,观察者设计模式,模板模式(Template), 适配器模式,装饰模式(Dec...

  • Retrofit源码解析

    设计模式:建造者模式、工厂方法模式、外观模式、代理模式、单例模式、策略模式、装饰模式、适配器模式、代理模式 一、R...

  • 设计模式(结构型模式)

    适配器模式、 装饰器模式、 代理模式、 外观模式、 桥接模式、 组合模式、 享元模式 适配器模式 即定义一个包装类...

  • Retrofit

    Retrofit设计模式 动态代理,装饰模式,建造者模式,抽象工厂模式,适配器模式 建造者模式创建Retrofit...

  • 设计模式:结构型

    享元模式 (Pools,Message) 代理模式 适配器模式 :类适配器和对象适配器 装饰者模式 外观模式 桥接...

  • 代理 & 适配器 & 装饰模式 对比

    代理 & 适配器 & 装饰模式 对比 适配器模式 vs 代理模式适配器模式: 提供一个不同的接口(如不同版本的接口...

  • 适配器模式,装饰模式,代理模式异同

    菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同 一、概念 适配器模式,允许因为接口不兼容而不能在一起工...

  • 设计模式分类

    创建型模式->5种: 常用的 结构性模式->7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式...

  • 设计模式之结构型模式(下)

    上篇已经介绍了适配器模式、桥接模式和组合模式,这篇将介绍装饰者模式、外观模式、享元模式和代理模式。 装饰者(Dec...

网友评论

      本文标题:【Go 精选】设计模式 - 代理、适配器和装饰器模式

      本文链接:https://www.haomeiwen.com/subject/ojxqjdtx.html