教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 【Golang实现设计模式】桥接模式

【Golang实现设计模式】桥接模式

发布时间:2022-01-17   编辑:jiaochengji.com
教程集为您提供【Golang实现设计模式】桥接模式等资源,欢迎您收藏本站,我们将为您提供最新的【Golang实现设计模式】桥接模式资源
<h2>介绍</h2>

意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

关键代码:抽象类依赖实现类。

应用实例: 1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。 2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。

<h2>实现图</h2>

Golang实现

<pre><code>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) } </code></pre>

test

<pre><code>package bridge import "fmt" func ExampleCommonSMS() { fmt.Println("ExampleCommonSMS") m := NewCommonMessage(ViaSMS()) m.SendMessage("have a drink?", "bob") // Output: // send have a drink? to bob via SMS } func ExampleCommonEmail() { fmt.Println("ExampleCommonEmail") m := NewCommonMessage(ViaEmail()) m.SendMessage("have a drink?", "bob") // Output: // send have a drink? to bob via Email } func ExampleUrgencySMS() { fmt.Println("ExampleUrgencySMS") m := NewUrgencyMessage(ViaSMS()) m.SendMessage("have a drink?", "bob") // Output: // send [Urgency] have a drink? to bob via SMS } func ExampleUrgencyEmail() { fmt.Println("ExampleUrgencyEmail") m := NewUrgencyMessage(ViaEmail()) m.SendMessage("have a drink?", "bob") // Output: // send [Urgency] have a drink? to bob via Email } </code></pre>

总结:在new对象的时候,通过new的方法以及new的参数方法,两种交叉确定后面的实现方法。然后通过公用定义的方法实现

到此这篇关于“【Golang实现设计模式】桥接模式”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang设计模式之桥接模式
Python之jieba分词相关介绍
【Golang实现设计模式】桥接模式
深入php设计模式实例详解
后端面试(Golang)可能会碰上的附加智力题
PHP设计模式概述
php设计模式是什么,该如何理解
JavaScript 设计模式读书笔记(六)——门面模式
【Go】Golang 实现单例模式
[设计模式][面板模式][Javascript]

[关闭]
~ ~