中介者模式(Mediator)
1.意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2.适用性
在下列情况下使用中介者模式 :
- 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
3.结构
4.代码
package mediator
/*
# 中介者或调停者模式
调停者模式是软件设计模式的一种,用于模块间解耦,通过避免对象互相显式的指向对方从而降低耦合。
用一个中介对象来封装一系列对象的交互,
从而把一批原来可能是交互关系复杂的对象转换成一组松散耦合的中间对象,以有利于维护和修改。
中介者模式封装对象之间互交,使依赖变的简单,并且使复杂互交简单化,封装在中介者中。
例子中的中介者使用单例模式生成中介者。
中介者的change使用switch判断类型。
*/
import (
"fmt"
"testing"
"time"
)
type deptA struct {
msg string
}
func (this *deptA)DoA(){
fmt.Println("deptA msg:",this.msg)
GetMediatorInstance().handle(this)
}
type deptB struct {
msg string
}
func (this *deptB)DoB(){
fmt.Println("deptB msg:",this.msg)
GetMediatorInstance().handle(this)
}
type deptC struct {
msg string
}
func (this *deptC)DoC(){
fmt.Println("deptC msg:",this.msg)
GetMediatorInstance().handle(this)
}
type deptD struct {
msg string
}
func (this *deptD)DoD(){
fmt.Println("deptD msg:",this.msg)
GetMediatorInstance().handle(this)
}
type DeptMediator struct {
msg string //自己的问题
depta *deptA
deptb *deptB
deptc *deptC
deptd *deptD
}
var deptMediator *DeptMediator
func GetMediatorInstance() *DeptMediator {
if deptMediator == nil {
deptMediator = &DeptMediator{}
}
return deptMediator
}
func (this *DeptMediator)handle(i interface{}){ //提交任务
switch dept:=i.(type){
case *deptA:
fmt.Println(time.Now().Format("03:04:05")+" 处理A部门",dept.msg,"问题...")
case *deptB:
fmt.Println(time.Now().Format("03:04:05")+" 处理B部门",dept.msg,"问题...")
case *deptC:
fmt.Println(time.Now().Format("03:04:05")+" 处理C部门",dept.msg,"问题...")
case *deptD:
fmt.Println(time.Now().Format("03:04:05")+" 处理D部门",dept.msg,"问题...")
case *DeptMediator:
fmt.Println(time.Now().Format("03:04:05")+" 处理自己部门",dept.msg,"问题...")
default:
fmt.Println("混进来一个闹事的,踢出去。。。。。。")
}
}
func (this *DeptMediator)Work(){
//模拟各个部门需要解决的问题
this.handle(this)
time.Sleep(time.Second)
this.depta.DoA()
time.Sleep(time.Second)
this.deptb.DoB()
time.Sleep(time.Second)
this.deptc.DoC()
time.Sleep(time.Second)
this.deptd.DoD()
}
func TestMediator(t *testing.T) {
mediator := GetMediatorInstance()
mediator.depta = &deptA{"打印机没纸了"}
mediator.deptb = &deptB{"电脑坏了"}
mediator.deptc = &deptC{"需求无法完成,找项目经理撕逼"}
mediator.deptd = &deptD{"找B部门求助"}
mediator.msg="人手不够"
mediator.Work()
}