zoukankan      html  css  js  c++  java
  • 设计模式 笔记 中介者模式 Mediator



    //---------------------------15/04/27----------------------------

    //Mediator 中介者模式----对象行为型模式


    /*

        1:意图:

            用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,

            而且可以独立地改变它们之间的交互。

        2:动机:

        3:适用性:

            1>一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。

            2>一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。

            3>想定制一个分布在多个类中的行为,而又不想生成太多的子类。

        4:结构:

                                                            Colleague:

                    Mediator:<-------------------------------mediator

                        |                                       |

                        |                               ------------------

                    ConreteMediator:                    |                |

                    concreteColleague1------------->ConcreteColleague1: ConcreteColleague2:<---------|

                    concreteColleague2---------------------------------------------------------------|

        5:参与者:

            1>Mediator

                中介者定义一个接口用于与各同事对象通信。

            2>ConcreteMediator

                1)具体中介者通过协调各同事对象实现协作行为。

                2)了解并维护他的各个同事。

            3>Colleague

                同事中存放了中介者对象,定义了与之通信的接口。

            4>ConcreteColleague

                在想与其他同事通信的时候,只需与中介者通信即可。

        6:协作:

            同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。

        7:效果:

            1>优点:

                1)减少子类生成:

                    Mediator讲原本分布于多个对象间的行为集中在一起。改变这些行为只需生成Mediator的子类即可。

                    这样各个Colleague类可被重用。

                2)它将各个Colleague解耦:

                    Mediator有利于各个Colleague间的松耦合,你可以独立地改变和复用各Colleague类和Mediator类。

                3)它简化了对象协议:

                    Mediator和各Colleague间的一对多的交互来代替多对多的交互。一对多的关系更易于理解、维护和

                    扩展。

                4)它对对象如何协作进行了抽象:

                    将中介作为一个独立的概念并将其封装在一个对象中,使你讲注意力从对象各自本身的行为转移到它们

                    之间的交互上来,这有助于弄清楚一个系统中的对象是如何交互的。

            2>缺点:

                它使控制集中化:

                    中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议,它可能变得比任何一个Colleague

                    都复杂,这可能使得中介者变成一个难以维护的庞然大物。

        8:实现:

            1>忽略抽象的Mediator类:

                当各Colleague仅与一个Mediator一起工作时,没有必要定义一个抽象的Mediator类。Mediator类提供的抽象

                耦合已经使各Colleague可与不同的Mediator子类一起工作。

            2>Colleague--Mediator通信:

                当一个感兴趣的事件发生时,Colleague必须与其Mediator通信。一种实现方法是使用观察者模式,将Mediator

                实现为一个Observer,各Colleague作为Subject。一旦状态改变就发送通知给MediatorMediator做出的

                响应是将状态改变的结果传播给其他的Colleague

        9:代码示例:                                                                             */


    //Mediator

    class DialogDirector

    {

       virtual ~DialogDirector();

        

       virtual void ShowDialog();

       virtual void WidgetChanged(Widget*) =0;

        

    protected:

        DialogDirector();

       virtual void CreateWidgets() =0;

    };


    //Colleague

    class Widget

    {

    public:

        Widget(DialogDirector*);

       virtual void Changed();

        

       virtual void HandleMouse(MouseEvent& event);

        

    private:

        DialogDirector* _director;

    };


    //通知Mediator自己改变了

    void Widget::Changed()

    {

        _director->WidgetChanged(this);

    }


    class ListBox :public Widget

    {

    public:

        ListBox(DialogDirector*);

        

       virtual constchar* GetSelection();

       virtual void SetList(List<char*>* listItems);

       virtual void HandleMouse(MouseEvent& event);

    };


    class EntryField :public Widget

    {

    public:

        EntryField(DialogDirector*);

        

       virtual void SetText(constchar* text);

       virtual constchar* GetText();

       virtual void HandleMouse(MouseEvent& event);

    };



    class Button :public Widget

    {

    public:

        Button(DialogDirector*);

        

       virtual void SetText(constchar* text);

       virtual void HandleMouse(MouseEvent& event);

    };


    void Button::HandleMouse(MouseEvent& event)

    {

        Changed();

    }


    //ConcreteMediator

    class FontDialogDirector :public DialogDirector

    {

    public:

        FontDialogDirector();

       virtual ~FontDialogDirector();

        

       virtual void WidgetChanged(Widget*);

        

    protected:

       virtual void CreateWidgets();

        

    private:

        Button* _ok;

        Button* _cancel;

        ListBox* _fontList;

        EntryField* _fontName;

    };



    void FontDialogDirector::CreateWidgets()

    {

        _ok =new Button(this);

        _cancel =new Button(this);

        _fontList =new ListBox(this);

        _fontName =new EntryField(this);

    }


    //使用if判断是哪个对象改变了,然后做出相应的操作,这里的信心只有改变,如果想

    //更具体可以在这个接口上增加一个参数,传入相应信息。

    void FontDialogDirector::WidgetChanged(Widget* theChangedWidget)

    {

       if(theChangedWidget == _fontList)

        {

            _fontName->SetText(_fontList->GetSelection());

        }

       else if (theChangedWidget == _ok)

        {

            ...

        }

       else ...

    }




  • 相关阅读:
    CentOS 7.0关闭默认防火墙启用iptables防火墙
    centos7 启动httpd的时候为什么显示是这样的
    CentOS配置本地yum源/阿里云yum源/163yuan源,并配置yum源的优先级
    Linux如何用yum安装软件或服务
    IE浏览器和Firefox浏览器兼容性问题及解决办法
    Input的size与maxlength属性的区别
    下拉框默认选择数据库取出数据
    登录到 SQL Server 实例
    安装sql server 2008重启失败
    值栈
  • 原文地址:https://www.cnblogs.com/boydfd/p/4983119.html
Copyright © 2011-2022 走看看