zoukankan      html  css  js  c++  java
  • DesignPatternMediator中介者模式

    DesignPatternMediator中介者模式

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

    UML

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

    实际案例

    联合国案例

    UML

    代码实现

    package other
    
    import "fmt"
    
    //实现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")
       }
    }
    
    //实现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
    ", 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
    ", message)
    }
    
    func TTmain() {
       //创建一个具体中介者
       tMediator := &UnitedNationsSecurityCouncil{}
       //创建具体同事,并且让他认识中介者
       tColleageA := USA{
          UnitedNations: tMediator,
       }
       tColleageB := Iraq{
          UnitedNations: tMediator,
       }
       //让中介者认识每一个具体同事
       tMediator.USA = tColleageA
       tMediator.Iraq = tColleageB
       //A同事发送消息
       tColleageA.SendMessage("停止核武器研发,否则发动战争")
       tColleageB.SendMessage("我们没有研发核武器,也不怕战争")
    }
    
    
    # 测试ttmain()输出
    伊拉克收到对方消息: 停止核武器研发,否则发动战争
    美国收到对方消息: 我们没有研发核武器,也不怕战争
    
  • 相关阅读:
    NHibernate初学者指南(12):日志
    NHibernate初学者指南(10):一级和二级缓存
    【翻译】EF 4.2 Code First 演示
    【翻译】EF 4.2 Model & Database First演示
    NHibernate初学者指南(14):配置的三种方式
    NHibernate初学者指南(16):条件查询
    NHibernate初学者指南(7):映射模型到数据库之方式三
    NHibernate初学者指南(13):监测与分析
    NHibernate初学者指南(6):映射模型到数据库之方式二
    NHibernate初学者指南(18):验证单个属性
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14118814.html
Copyright © 2011-2022 走看看