中介者模式(Mediator)

中介者模式(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()
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

metabit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值