zoukankan      html  css  js  c++  java
  • 设计模式18——行为型模式之中介者模式

     定义:中介者模式(MediatorPattern),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

    类型:对象行为型模式

    概述:

              面向对象编程,鼓励将行为分散到对象当中。这样的好处,增强对象的可复用性,但是带来的负面作用是,当多个对象交互时不可避免地会带来耦合性的大大提升。

              中介者模式的提出,就是为了解决多个对象相互交互时耦合性提升的问题。中介者模式主要通过将不同对象中涉及到交互的行为抽象出来,达到解耦的作用。这样,每个对象都只需要和中介者打交到即可,不用关注太多的对象。

             比如一个项目组,有一个项目经理和几个项目开发人员。如,开发人员需要开发资料,直接找项目经理要,项目经理去协调采购人员进行采购。又如,开发人员需要了解一个具体的需求,也直接找项目经理,然后项目经理去找销售人员了解更详细的需求。总之,开发人员,需要什么,都直接找项目经理就可以了,而不必关心去找谁,并如何跟对象交流。这样看来,开发人员就不会和其他对象产生交互,也就不会有很大的耦合性,比较纯粹,专注于自己的开发就好。这样,只要技术过关的人都可以充当开发人员,而不必要有各种关系,沟通技巧之类的。提高了开发人员的可复用性。

    类图:


    参与者:

    1. Mediator,提供与Staff交互的接口。
    1. ProjectManger,实现具体的接口来完成和不同职员的交互。
    1. Staff,提供成员与Mediator交互的基本接口。
    2. DeveloperBuyerSeller,完成各自的工作,然后通过Meditor的接口告诉具体的ProjectManager

    示例代码:

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Text;  
    4. namespace MediatorPattern  
    5. {  
    6.     abstract class Mediator  
    7.     {  
    8.         public abstract void Comunicate(string message, Staff colleague);  
    9.     }  
    10.     class ProjectManger : Mediator  
    11.     {  
    12.         private Developer staff1;  
    13.         private Buyer staff2;  
    14.         private Seller staff3;  
    15.         public Developer Staff1  
    16.         {  
    17.             set { staff1 = value; }  
    18.         }  
    19.         public Buyer Staff2  
    20.         {  
    21.             set { staff2 = value; }  
    22.         }  
    23.         public Seller Staff3  
    24.         {  
    25.             set { staff3 = value; }  
    26.         }  
    27.         public override void Comunicate(string message, Staff staff)  
    28.         {  
    29.             staff.Notify(message);  
    30.         }  
    31.     }  
    32.     abstract class Staff  
    33.     {  
    34.         protected Mediator mediator;  
    35.         public Staff(Mediator mediator)  
    36.         {  
    37.             this.mediator = mediator;  
    38.         }  
    39.         public abstract void Notify(string message);  
    40.     }  
    41.     class Developer : Staff  
    42.     {  
    43.         public Developer(Mediator mediator)  
    44.             : base(mediator)  
    45.         {  
    46.         }  
    47.         public void Ask(string message)  
    48.         {  
    49.             mediator.Comunicate(message, this);  
    50.         }  
    51.         public override void Notify(string message)  
    52.         {  
    53.             Console.WriteLine("开发人员完成开发任务" + message);  
    54.         }  
    55.     }  
    56.     class Buyer : Staff  
    57.     {  
    58.         public Buyer(Mediator mediator)  
    59.             : base(mediator)  
    60.         {  
    61.         }  
    62.         public void Send(string message)  
    63.         {  
    64.             mediator.Comunicate(message, this);  
    65.         }  
    66.         public override void Notify(string message)  
    67.         {  
    68.             Console.WriteLine("采购人员已经知道" + message);  
    69.         }  
    70.     }  
    71.     class Seller : Staff  
    72.     {  
    73.         public Seller(Mediator mediator)  
    74.             : base(mediator)  
    75.         {  
    76.         }  
    77.         public void Tell(string message)  
    78.         {  
    79.             mediator.Comunicate(message, this);  
    80.         }  
    81.         public override void Notify(string message)  
    82.         {  
    83.             Console.WriteLine("销售人员已经知道" + message);  
    84.         }  
    85.     }  
    86.     class Program  
    87.     {  
    88.         static void Main(string[] args)  
    89.         {  
    90.             ProjectManger mediator = new ProjectManger();  
    91.             Developer staff1 = new Developer(mediator);  
    92.             Buyer staff2 = new Buyer(mediator);  
    93.             Seller staff3 = new Seller(mediator);  
    94.             mediator.Staff1 = staff1;  
    95.             mediator.Staff2 = staff2;  
    96.             mediator.Staff3 = staff3;  
    97.             staff1.Ask("需要电路板");  
    98.             staff2.Send("已经采购电路板");  
    99.             staff1.Ask("需要客户需求");  
    100.             staff3.Tell("已经去调查");  
    101.         }  
    102.     }  
    103. }  
    适用性:
    1. 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
    2. 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
    1. 想定制一个分面在多个类中的行为,而又不想生成太多的子类。

    优缺点:

    1. 优点,降低对象之间的耦合度,提高对象的可复用用程度。
    1. 缺点,如果交互的对象过多,中介者会非常复杂,难于管理。

    参考资料:

      1. 《设计模式——可复用面向对象软件基础》
      2. 《大话设计模式》
  • 相关阅读:
    javascript的window.open()具体解释
    Async.js解决Node.js操作MySQL的回调大坑
    入门--JTBC系统学习(1)
    Hadoop1.2.1 全然分布式集群搭建实操笔记
    Hessian原理与程序设计
    pycharm最新注册方法 pycharm最新激活方法 2016pycharm最新注册方法
    如何修改linux时间? 校正linux系统的时间
    python 内建函数 type() 和 isinstance() 介绍
    标准类型内建函数 str()和 repr() (及 `` 运算符) 简单介绍
    标准类型内建函数 cmp()介绍
  • 原文地址:https://www.cnblogs.com/feihe0755/p/3587184.html
Copyright © 2011-2022 走看看