• 设计模式漫谈之中介者模式


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

    在面向对象中,对象之间的认识是分角度的,比如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("我们没有核武器,也不怕侵略。");

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

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

  • 相关阅读:
    可闭环、可沉淀、可持续的企业级数据赋能体系
    案例解读|迁云的灵魂3问,降多少本,增多少效,真平滑否?
    Serverless 实战——使用 Rendertron 搭建 Headless Chrome 渲染解决方案
    从零开始入门 K8s | etcd 性能优化实践
    State Processor API:如何读取,写入和修改 Flink 应用程序的状态
    阿里云叔同:以容器为代表的云原生技术,已成为释放云价值的最短路径
    Flink SQL 如何实现数据流的 Join?
    仅1年GitHub Star数翻倍,Flink 做了什么?
    codeforces div2_603 F. Economic Difficulties(树dfs预处理+dp)
    codeforces div2_604 E. Beautiful Mirrors(期望+费马小定理)
  • 原文地址:https://www.cnblogs.com/wang-charle/p/9248782.html
Copyright © 2020-2023  润新知