zoukankan      html  css  js  c++  java
  • 设计模式漫谈之中介者模式

    天太热,失眠了,实在睡不下去,就再写篇文章来静静心吧,我为什么写设计模式,因为设计模式是思想上的东西,程序员的法宝之一就是编程思想。

    在面向对象中,对象之间的认识是分角度的,比如A对象,B对象,如果A对象存了B对象的引用,那么从A对象的角度来说,A对象认识B对象,但是B对象不认识A对象,如果B对象也存了A对象的引用,这时,才能说A,B互相认识。

    或者是A,B对象互相不认识,但是A,B对象都认识C对象,而C对象认识A,B对象,这样,可以通过C对象来间接让A,B对象互相认识,互相通信。扮演红娘角色,即中介角色。

    对象之间的认识分区域性,比如在对象的整个生命中期都认识的对象(父母),或者是过客,我只在某个时间(时间即空间)认识的对象(某个旅游景点认识的驴友)。

    比如种种原因,两个对象不想直接发生关系,就找一个中间人传话。

    直接上例子,我来解释:

    //抽象对象UnitedNations在方法中认识Country 

    abstract class UnitedNations
    {

    public abstract void Declare(string message, Country colleague);
    }

    //具体对象认识USA, Iraq 这两个对象在方法中认识Country这个对象

    class UnitedNationsSecurityCouncil : UnitedNations
    {
    private USA colleague1;
    private Iraq colleague2;

    public USA Colleague1
    {
    set { colleague1 = value; }
    }

    public Iraq Colleague2
    {
    set { colleague2 = value; }
    }

    public override void Declare(string message, Country colleague)
    {
    if (colleague == colleague1)
    {
    colleague2.GetMessage(message);
    }
    else
    {
    colleague1.GetMessage(message);
    }
    }
    }

    //抽象对象认识UnitedNations 这个对象

    abstract class Country
    {
    protected UnitedNations mediator;

    public Country(UnitedNations mediator)
    {
    this.mediator = mediator;
    }
    }

    //具体对象USA在整个生命周期中都认识mediator这个对象

    class USA : Country
    {
    public USA(UnitedNations mediator)
    : base(mediator)
    {

    }

    public void Declare(string message)
    {
    mediator.Declare(message, this);
    }

    public void GetMessage(string message)
    {
    Console.WriteLine("美国获得对方信息:" + message);
    }
    }

    //具体对象在整个生命中期都认识mediator

    class Iraq : Country
    {
    public Iraq(UnitedNations mediator)
    : base(mediator)
    {
    }


    public void Declare(string message)
    {
    mediator.Declare(message, this);
    }

    public void GetMessage(string message)
    {
    Console.WriteLine("伊拉克获得对方信息:" + message);
    }

    }

    /具体的中介对象

    UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();

    //c1 对象认识中介者

    USA c1 = new USA(UNSC);

    //c2对象也认识中介者
    Iraq c2 = new Iraq(UNSC);

    //中介者认识c1,c2两个对象

    UNSC.Colleague1 = c1;
    UNSC.Colleague2 = c2;

    //c1说话,让中介者传话

    c1.Declare("不准研制核武器,否则要发动战争!");

    //同样c2发消息也是让中介者传话
    c2.Declare("我们没有核武器,也不怕侵略。");

    总结,对象之间的认识关系分区域性,在哲学中,区域性相当于时间性,对象认识另一个对象,必须可以访问另一个对象的空间,即另一个对象的引用。

    老生常谈,编程的法宝之一就是编程思想。

  • 相关阅读:
    Centos 通过yum的方式升级内核
    docker入门——镜像简介
    docker入门——管理容器
    docker入门——安装及简单操作
    docker入门——简介
    Centos 6安装 Jenkins
    Centos 7 搭建OpenStack 私有云——(1)基础环境配置
    Python正则表达式
    多选控件multipicker
    绝对定位 软键盘弹出时顶起底部按钮
  • 原文地址:https://www.cnblogs.com/wang-charle/p/9248782.html
Copyright © 2011-2022 走看看