Golang中介者设计模式(十七)

57 篇文章 4 订阅
24 篇文章 7 订阅

github:https://github.com/zhumengyifang/GolangDesignPatterns

上一篇:https://blog.csdn.net/weixin_40165163/article/details/90968990

中介者模式

中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持送耦合,是代码易于维护。中介者模式属于行为型模式。

介绍

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

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时作出相应的处理。

何时使用:多个类相互耦合,形成了网状结构。

如何解决:将上述网状结构分离为星型结构。

优点

  • 歼敌了类的复杂度,将一对多转化成一对一
  • 各个类之间的解偶
  • 符合迪米特原则

缺点:中介者会庞大,变得复杂难以维护

使用场景:

  • 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象
  • 向通过一个中间类来封装多个类的行为,而又不想生成太多的子类

注意事项:不应在职责混乱的时候使用

实现:

我们通过聊天例子来演示中介者模式,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。我们将创建两个类ChatRoom和User。User对象使用CHatRoom方法来分享他们的消息。

MediatorPatternDemo,我们的演示类使用 User 对象来显示他们之间的通信。

import (
	"fmt"
	"time"
)
//中介
type ChatRoom struct {
}

func (c *ChatRoom) ShowMessage(user *User, message string) {
	fmt.Println(time.Now(), "User", user.GetName(), ":", message)
}
package MediatorPattern

type User struct {
	name string
}

func (u *User) User(name string) {
	u.name = name
}

func (u *User) GetName() string {
	return u.name
}

func (u *User) SetName(name string) {
	u.name = name
}

func (u *User) SendMessage(message string) {
	chatRoom:=new(ChatRoom)
	chatRoom.ShowMessage(u,message)
}

测试: 

func testMediatorPattern() {
	robert := new(MediatorPattern.User)
	robert.User("Robert")

	john := new(MediatorPattern.User)
	john.User("John")

	robert.SendMessage("Hi John")
	john.SendMessage("Hi Robert")
}

输出 :

2019-06-06 22:50:31.891027 +0800 CST m=+0.000175582 User Robert : Hi John
2019-06-06 22:50:31.891151 +0800 CST m=+0.000299525 User John : Hi Robert

下一篇章:https://blog.csdn.net/weixin_40165163/article/details/91052749

以下是几种常见的Golang设计模式: 1. 工厂模式(Factory Pattern):用于创建对象的模式,通过定义一个创建对象的接口来实现对象的实例化。 ```go type Shape interface { Draw() } type Circle struct{} func (c *Circle) Draw() { fmt.Println("Drawing a circle") } type Rectangle struct{} func (r *Rectangle) Draw() { fmt.Println("Drawing a rectangle") } type ShapeFactory struct{} func (sf *ShapeFactory) GetShape(shapeType string) Shape { if shapeType == "circle" { return &Circle{} } else if shapeType == "rectangle" { return &Rectangle{} } return nil } func main() { factory := &ShapeFactory{} circle := factory.GetShape("circle") circle.Draw() // 输出:Drawing a circle rectangle := factory.GetShape("rectangle") rectangle.Draw() // 输出:Drawing a rectangle } ``` 2. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。 ```go type Singleton struct{} var instance *Singleton func GetInstance() *Singleton { if instance == nil { instance = &Singleton{} } return instance } func main() { singleton1 := GetInstance() singleton2 := GetInstance() fmt.Println(singleton1 == singleton2) // 输出:true } ``` 3. 观察者模式(Observer Pattern):定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。 ```go type Subject struct { observers []Observer } func (s *Subject) Attach(observer Observer) { s.observers = append(s.observers, observer) } func (s *Subject) Notify() { for _, observer := range s.observers { observer.Update() } } type Observer interface { Update() } type ConcreteObserver struct{} func (co *ConcreteObserver) Update() { fmt.Println("Observer is updated") } func main() { subject := &Subject{} observer := &ConcreteObserver{} subject.Attach(observer) subject.Notify() // 输出:Observer is updated } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值