• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

设计模式go语言实现----中介者模式mediator

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1 定义

中介者模式(Mediator): 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间地交互

模式动机:
对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之称为一个松耦合的系统,这就是中介者模式的模式动机
UML类图:

中介者模式包含以下四个角色:

  • Mediator(抽象中介者):它定义了一个接口,该接口用于与各同事对象之间进行通信。
  • ConcreteMediator(具体中介者):它实现了接口,通过协调各个同事对象来实现协作行为,维持各个同事对象的引用
  • Colleague(抽象同事类):它定义了各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
  • ConcreteColleague(具体同事类):抽象同事类的子类,每一个同事对象需要和其他对象通信时,都需要先与中介者对象通信,通过中介者来间接完成与其他同事类的通信
    我们下面以联合国的例子进行说明,其UML类图如下:

2 go语言实现

2.1 实现Mediator以及ConcreteMediator类

type UnitedNations interface {
	ForwardMessage(message string, country Country)
}

type UnitedNationsSecurityCouncil struct {
	USA
	Iraq
}

func (unsc UnitedNationsSecurityCouncil) ForwardMessage(message string, country Country) {
	switch country.(type) {
	case USA:
		unsc.Iraq.GetMessage(message)
	case Iraq:
		unsc.USA.GetMessage(message)
	default:
		fmt.Println("The country is not a member of UNSC")
	}

}

2.2 实现Colleague以及ConcreteColleague类

type Country interface {
	SendMessage(message string)
	GetMessage(message string)
}
type USA struct {
	UnitedNations
}

func (usa USA) SendMessage(message string) {
	usa.UnitedNations.ForwardMessage(message, usa)
}

func (usa USA) GetMessage(message string) {
	fmt.Printf("美国收到对方消息: %s\n", message)
}

type Iraq struct {
	UnitedNations
}

func (iraq Iraq) SendMessage(message string) {
	iraq.UnitedNations.ForwardMessage(message, iraq)
}

func (iraq Iraq) GetMessage(message string) {
	fmt.Printf("伊拉克收到对方消息: %s\n", message)
}

2.3 客户端调用

func main() {
	//创建一个具体中介者
	tMediator := mediator.UnitedNationsSecurityCouncil{}
	//创建具体同事,并且让他认识中介者
	tColleageA := mediator.USA{
		UnitedNations: tMediator,
	}
	tColleageB := mediator.Iraq{
		UnitedNations: tMediator,
	}
	//让中介者认识每一个具体同事
	tMediator.USA = tColleageA
	tMediator.Iraq = tColleageB
	//A同事发送消息
	tColleageA.SendMessage("停止核武器研发,否则发动战争")
	tColleageB.SendMessage("我们没有研发核武器,也不怕战争")
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go-百度贴吧-纵向爬取发布时间:2022-07-10
下一篇:
(9)Go指针发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap