设计模式--中介者模式C++实现

中介者模式C++实现

1定义

用一个中介对象封装一系列的对象交互,中介者使各个对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互

2类图

《设计模式--中介者模式C++实现》

组成说明

Mediator抽象中介者角色,定义统一接口,用于各个同事角色之间的通信

ConcreteMediator具体中介者角色,通过协调各个同事角色实现协作行为,依赖于各个同事

Colleague同事角色,每个同事角色都应该知道中介的存在,且同事间通信一定是通过中介协作;同事行为分:自发行为,依赖行为。

3实现

class Mediator

{

protected:

  Mediator();

public:

  virtual ~Mediator()=0;

protected:

  ConcreteColleague1 c1;

  ConcreteColleague2 c2;

public:

  ConcreteColleague1 *getC1()

  {

    return c1;

  }

  ConcreteColleague2 *getC2()

  {

    return c2;

  }

  virtual void doSomething1() = 0;

  virtual void doSomething2() = 0;

};

//中介者

class ConcreteMediator:public Mediator

{

public:

  void doSomething1()

  {}

  void doSomething2()

  {}

};

 

class Colleague

{

public:

  Colleague(Mediator me)

  :mediator(me)

  {}

public:

  virtual ~Colleague()=0;

protected:

  Mediator mediator;

};

 

class ConcreteColleague1: public Colleague

{

public:

  ConcreteColleague1(Mediator me)

  :Colleague(me)

  {} 

  void Self_method1()

  {}

  //依赖方法

  void depMethod1()

  {

    //处理自己的业务

    //自己不能够处理的业务交给中介,让其进行通信协作

    mediator.doSomething2();

  }

};

class ConcreteColleague2: public Colleague

{

public:

  ConcreteColleague2(Mediator me)

  :Colleague(me)

  {}

  void Self_method2()

  {}

  //依赖方法

  void depMethod2()

  {

    //处理自己的业务

    //自己不能够处理的业务交给中介,让其进行通信协作

    mediator.doSomething2();

  }

};

注:同事类使用构造函数注入中介者,而中介者使用setter/getter注入同事类,因为同事类必须有中介者,而中介者只有部分同事类

4应用

①优点

减少类间依赖,把一对多的依赖转变成一对一。同事类只依赖中介,降低类间耦合

②缺点,中介者会随着同事类的增多,逻辑越来越复杂

5使用场景

简单但是不容易使用的一个模式。把握一个准则:当类图中出现蜘蛛网时,尝试使用中介者

实际应用:机场调度中心,MVC框架中的C(Controller),媒体网关,中介服务。

6提示-最佳使用

N个对象间产生依赖关系(N>2)

多个对象有依赖关系,但是尚不确定或者有发生改变的可能,使用中介者降低风险扩散

产品开发:eg MVC框架。把中介者模式应用到产品中,可以提升产品性能和扩展性,但是对项目就未必。项目是以支付投产为目标,而产品则是以稳定,高效扩展为宗旨。

    原文作者:狼行博客园
    原文地址: https://www.cnblogs.com/lang5230/p/5324524.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞