模式定义

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

类图

在这里插入图片描述

应用场景

当多个对象互相关联交互并存在复杂的引用关系时,且对新需求需要进行大量更改时使用中介者模式解耦合

优点

可以避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化

要点总结

要点总结

  • 将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化
  • 随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂,这时候可以对Mediator对象进行分解处理
  • Facade模式是解耦系统间(单向)的对象关联关系,Mediator模式是解耦系统内各个对象之间(双向)的关联关系

Go语言代码实现

工程目录

在这里插入图片描述

mediator.go

package Mediator

import "fmt"

type Mediator interface {
   Communicate (who string)
}

type WildStallion interface {
   SetMediator(mediator Mediator)
}

type Bill struct {
   mediator Mediator
}
func (b * Bill) SetMediator(mediator Mediator) {
   b.mediator = mediator
}

func (b * Bill) Respond () {
   fmt.Println("bill what ?")
   b.mediator.Communicate("bill")
}

type Ted struct {
   mediator Mediator
}

func (t *Ted) Talk () {
   fmt.Println("Ted : Bill?")
   t.mediator.Communicate("Ted")
}

func (t *Ted) SetMediator(mediator Mediator) {
   t.mediator = mediator
}

func (t *Ted) Respond() {
   fmt.Println("Ted:how are you today?")
}
type ConcreteMediator struct {
   Bill
   Ted
}

func NewMediator() *ConcreteMediator {
   mediator := &ConcreteMediator{}
   mediator.Bill.SetMediator(mediator)
   mediator.Ted.SetMediator(mediator)
   return mediator
}

func (m *ConcreteMediator) Communicate(who string) {
   if who == "Ted" {
      m.Bill.Respond()
   }else {
      m.Ted.Respond()
   }
}

mediator_test.go

package Mediator

import "testing"

func TestNewMediator(t *testing.T) {
   mediator := NewMediator()
   mediator.Ted.Talk()
}

Yuan_sr
18 声望6 粉丝