go中设计模式之结构型模式(代码片段)

author author     2022-12-21     431

关键词:

外观模式

1. 定义: 外部与一个子系统通信必须通过一个统一的对象进行,为子系统中的一组接口提供一致界面。

2. 代码示例:

// 定义对外API
type API interface 
    Test()


func NewAPI() API 
    return apiImplnewMod()


type apiImpl struct 
    m mod


func (a apiImpl) Test() 
    a.m.mod()


// 需要交互的内部模块
type mod interface 
    mod()


func newMod() mod 
    return modImpl


type modImpl struct 


func (m modImpl) mod() 


3. 实现步骤

  • 定义内部模块
  • 定义对外交互接口及实现

4. 使用场景

  • 当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。
  • 客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
  • 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

5. 优点

对客户屏蔽子系统组件

适配器模式

1. 定义: 将一个接口转换成客户希望的另一个接口。

2. 代码示例:

// 定义被适配的接口
type Adapter interface 
    Request() string


type adaptee struct 


func (adaptee) Request() string 


func NewAdapter() Adapter 
    return &adaptee


// 定义目标接口
type Target interface 
    TargetRequest() string


func New(adapter Adapter) Target 
    return &targetadapter


type target struct 
    Adapter


func (t *target) TargetRequest() 
    t.Request()

3. 实现步骤

  • 定义被适配的接口和实现
  • 定义目标接口和实现,并且实现接口由被适配接口创建

4. 使用场景

系统需要使用现有的类,而这些类的接口不符合系统的需要。

5. 优点

将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。

装饰模式

1. 定义: 动态地给一个对象增加一些额外的职责。

2. 代码示例:

// 定义组件
type Component interface 
    Calc() int


type ConcreteComponent struct

func (*ConcreteComponent) Calc() int 
    return 0


// 定义装饰对象
type MulDecorator struct 
    Component
    num int


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


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


type AddDecorator struct 
    Component
    num int


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


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

3. 实现步骤

  • 定义组件
  • 定义装饰对象
  • 使用装饰对象生成组件

4. 使用场景

在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

5. 优点

可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为。

享元模式

1. 定义: 享元模式通过共享技术实现相同或相似对象的重用。

2. 代码示例:

// 定义享元对象
type ImageFlyweight struct 
    data string


func NewImageFlyweight(filename string) *ImageFlyweight 
    // Load image file
    data := fmt.Sprintf("image data %s", filename)
    return &ImageFlyweight
        data: data,
    


func (i *ImageFlyweight) Data() string 
    return i.data


// 定义享元对象工厂
type ImageFlyweightFactory struct 
    maps map[string]*ImageFlyweight


var imageFactory *ImageFlyweightFactory

func GetImageFlyweightFactory() *ImageFlyweightFactory 
    if imageFactory == nil 
        imageFactory = &ImageFlyweightFactory
            maps: make(map[string]*ImageFlyweight),
        
    
    return imageFactory


func (f *ImageFlyweightFactory) Get(filename string) *ImageFlyweight 
    image := f.maps[filename]
    if image == nil 
        image = NewImageFlyweight(filename)
        f.maps[filename] = image
    

    return image


type ImageViewer struct 
    *ImageFlyweight


func NewImageViewer(filename string) *ImageViewer 
    image := GetImageFlyweightFactory().Get(filename)
    return &ImageViewer
        ImageFlyweight: image,
    


func (i *ImageViewer) Display() 
    fmt.Printf("Display: %s\n", i.Data())

3. 实现步骤

  • 定义享元对象
  • 定义享元工厂
  • 使用享元工厂创建

4. 使用场景

  • 一个系统有大量相同或者相似的对象,由于这类对象的大量使用,造成内存的大量耗费。
    对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
  • 使用享元模式需要维护一个存储享元对象的享元池,而这需要耗费资源,因此,应当在多次重复使用享元对象时才值得使用享元模式。

5. 优点

享元模式从对象中剥离出不发生改变且多个实例需要的重复数据,独立出一个享元,使多个对象共享,从而节省内存以及减少对象数量。

代理模式

1. 定义: 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

2. 代码示例:

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

3. 实现步骤

  • 定义接口
  • 定义实现对象
  • 定义代理实现对象

4. 使用场景

  • 并由代理对象控制对原对象的引用,增加请求注入劫持

5. 优点

代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

桥接模式

1. 定义: 给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。

2. 代码示例:

package bridge

import "fmt"

type AbstractMessage interface 
    SendMessage(text, to string)


type MessageImplementer interface 
    Send(text, to string)


type MessageSMS struct

func ViaSMS() MessageImplementer 
    return &MessageSMS


func (*MessageSMS) Send(text, to string) 
    fmt.Printf("send %s to %s via SMS", text, to)


type MessageEmail struct

func ViaEmail() MessageImplementer 
    return &MessageEmail


func (*MessageEmail) Send(text, to string) 
    fmt.Printf("send %s to %s via Email", text, to)


type CommonMessage struct 
    method MessageImplementer


func NewCommonMessage(method MessageImplementer) *CommonMessage 
    return &CommonMessage
        method: method,
    


func (m *CommonMessage) SendMessage(text, to string) 
    m.method.Send(text, to)


type UrgencyMessage struct 
    method MessageImplementer


func NewUrgencyMessage(method MessageImplementer) *UrgencyMessage 
    return &UrgencyMessage
        method: method,
    


func (m *UrgencyMessage) SendMessage(text, to string) 
    m.method.Send(fmt.Sprintf("[Urgency] %s", text), to)

3. 实现步骤

4. 使用场景

5. 优点

[设计模式c++go]结构型模式:代理模式(代码片段)

文章目录代理模式介绍类图代码实现C++测试Go测试优缺点代理模式在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。其定义为:Provideasurrogateorplaceholderforanotherobjecttocontrolaccesstoit.(为其他... 查看详情

结构型模式之外观模式(代码片段)

...更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。主要解决:降低访问复杂系统的... 查看详情

[设计模式c++go]结构型模式:桥接模式(代码片段)

...与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。其定义为:桥梁模式(BridgePattern)也叫做桥接模式,是一个 查看详情

[设计模式c++go]结构型模式:装饰器模式(代码片段)

...象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类&#x 查看详情

设计模式之组合模式(代码片段)

...和小王探讨书房、书架、各类书的管理问题,引出结构型设计模式家族中的一个重要成员——组合模式,本文会给予两种组合模式的典型代码实现,为了加深理解会在第三部分应用中介绍组合模式在源码中的实际运用,最后总结... 查看详情

设计模式之-代理模式(proxypattern)(代码片段)

...ProxyPattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 C++代码实现:#include<iostream>usingnamespacestd;//抽象类,抽象的... 查看详情

设计模式之组合模式(结构型)(代码片段)

1、组合模式定义组合模式(Composite),将对象组合成树形结构以表示部分-整体的层次结构。组合模式使用户对单个对象和组合对象的使用具有一致性2、组合模式结构Component为组合中的对象声明接口,在适当情况... 查看详情

结构型模式之享元模式(代码片段)

...是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高 查看详情

设计模式之外观模式(结构型)(代码片段)

1、外观模式定义外观模式(Facade)为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使系统更加容易使用当一个系统随着时间的流逝,子系统越来越多,功能越来越复... 查看详情

设计模式之外观模式(结构型)(代码片段)

1、外观模式定义外观模式(Facade)为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使系统更加容易使用当一个系统随着时间的流逝,子系统越来越多,功能越来越复... 查看详情

设计模式之享元模式(结构型)(代码片段)

...量级的意思,指拳击比赛中的特轻量级拳击手。这个设计模式的作用就是为了将对象变轻,也就是对象使用的内存大小。一般情况下需要大量对象使用new进行创建&# 查看详情

结构型设计模式之享元模式(代码片段)

@TOC享元模式概述目的1、系统有大量相似对象。2、需要缓冲池的场景。例如1、JAVA中的String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。2、数据库的数据池。优缺点优点:1.减少对象的创建,降低内存... 查看详情

学习go语言之装饰器模式(代码片段)

一,首先理解装饰器模式:动态的给一个对象增加一些额外的职责,这是在软件设计原则上面,一个功能装饰另一个功能,每个功能遵循同一个接口是这个模式的特征。二,定义对象接口和装饰抽象类1typeIDecorateinterface2Do()345//装... 查看详情

设计模式之结构型模式(代码片段)

在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出... 查看详情

设计模式之桥接模式(代码片段)

本文通过老王和小王买车,引出设计模式中的结构型设计之桥接模式,接着说明设计型模式的概念和代码实现,为了加深理解,会说明适配器设计模式在JDBC中的应用,最后谈谈桥接模式和适配器模式的总结。读者可以拉取完整... 查看详情

结构型模式之装饰模式(代码片段)

装饰模式(DecoratorPattern)是一种比较常见的模式。定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。装饰模式类图如下所示。 装饰模式有以下4个角色。抽象构件(Component)角... 查看详情

结构型模式之装饰模式(代码片段)

...,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。一般有两种方式可以实现给一个类或对象增加行为:继承机制,使用继承机制 查看详情

设计模式之-外观模式(facadepattern)(代码片段)

外观模式外观模式(FacadePattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为... 查看详情