zoukankan      html  css  js  c++  java
  • 协调多个对象之间的交互—中介者模式(二)

    20.2 中介者模式概述

           如果在一个系统中对象之间的联系呈现为网状结构,如图20-4所示。对象之间存在大量的多对多联系,将导致系统非常复杂,这些对象既会影响别的对象,也会被别的对象所影响,这些对象称为同事对象,它们之间通过彼此的相互作用实现系统的行为。在网状结构中,几乎每个对象都需要与其他对象发生相互作用,而这种相互作用表现为一个对象与另外一个对象的直接耦合,这将导致一个过度耦合的系统。

    20-4 对象之间存在复杂关系的网状结构

          中介者模式可以使对象之间的关系数量急剧减少,通过引入中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,如图20-5所示。在这个星形结构中,同事对象不再直接与另一个对象联系,它通过中介者对象与另一个对象发生相互作用。中介者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为新对象的引入带来大量的修改工作。

    20-5 引入中介者对象的星型结构

          如果在一个系统中对象之间存在多对多的相互关系,我们可以将对象之间的一些交互行为从各个对象中分离出来,并集中封装在一个中介者对象中,并由该中介者进 行统一协调,这样对象之间多对多的复杂关系就转化为相对简单的一对多关系。通过引入中介者来简化对象之间的复杂交互,中介者模式是“迪米特法则”的一个典型应用

     

          中介者模式定义如下:

    中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

          在中介者模式中,我们引入了用于协调其他对象/类之间相互调用的中介者类,为了让系统具有更好的灵活性和可扩展性,通常还提供了抽象中介者,其结构图如图20-6所示:

    20-6 中介者模式结构图

          在中介者模式结构图中包含如下几个角色:

         Mediator(抽象中介者):它定义一个接口,该接口用于与各同事对象之间进行通信。

         ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用

         Colleague(抽象同事类):它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。

         ConcreteColleague(具体同事类):它是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。

          中介者模式的核心在于中介者类的引入,在中介者模式中,中介者类承担了两方面的职责:

           (1) 中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,可通过中介者来实现间接调用。该中转作用属于中介者在结构上的支持。

          (2) 协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致的和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。

          在中介者模式中,典型的抽象中介者类代码如下所示:

    1. abstract class Mediator  
    2.     protected ArrayList colleagues; //用于存储同事对象  
    3.   
    4.     //注册方法,用于增加同事对象  
    5.     public void register(Colleague colleague)  
    6.         colleagues.add(colleague);  
    7.      
    8.   
    9.     //声明抽象的业务方法  
    10.     public abstract void operation();  
    11.  

           在抽象中介者中可以定义一个同事类的集合,用于存储同事对象并提供注册方法,同时声明了具体中介者类所具有的方法。在具体中介者类中将实现这些抽象方法,典型的具体中介者类代码如下所示:

    1. class ConcreteMediator extends Mediator  
    2.     //实现业务方法,封装同事之间的调用  
    3.     public void operation()  
    4.         ......  
    5.         ((Colleague)(colleagues.get(0))).method1(); //通过中介者调用同事类的方法  
    6.         ......  
    7.      
    8.  

          在具体中介者类中将调用同事类的方法,调用时可以增加一些自己的业务代码对调用进行控制。

          在抽象同事类中维持了一个抽象中介者的引用,用于调用中介者的方法,典型的抽象同事类代码如下所示:

    1. abstract class Colleague  
    2.     protected Mediator mediator; //维持一个抽象中介者的引用  
    3.       
    4.     public Colleague(Mediator mediator)  
    5.         this.mediator=mediator;  
    6.      
    7.       
    8.     public abstract void method1(); //声明自身方法,处理自己的行为  
    9.       
    10.     //定义依赖方法,与中介者进行通信  
    11.     public void method2()  
    12.         mediator.operation();  
    13.      
    14.  

           在抽象同事类中声明了同事类的抽象方法,而在具体同事类中将实现这些方法,典型的具体同事类代码如下所示:

    1. class ConcreteColleague extends Colleague  
    2.     public ConcreteColleague(Mediator mediator)  
    3.         super(mediator);  
    4.      
    5.       
    6.     //实现自身方法  
    7.     public void method1()  
    8.         ......  
    9.      
    10.  

          在具体同事类ConcreteColleague中实现了在抽象同事类中声明的方法,其中方法method1()是同事类的自身方法(Self-Method),用于处理自己的行为而方法method2()依赖方法(Depend-Method),用于调用在中介者中定义的方法,依赖中介者来完成相应的行为,例如调用另一个同事类的相关方法。

    疑问

    思考

    如何理解同事类中的自身方法与依赖方法?



    【作者:刘伟 http://blog.csdn.net/lovelion

  • 相关阅读:
    yolo_to_onnx ValueError: need more tan 1 value to unpack
    yolo_to_onnx killed
    C++ 实现二维矩阵的加减乘等运算
    Leetcode 1013. Partition Array Into Three Parts With Equal Sum
    Leetcode 1014. Best Sightseeing Pair
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 219. Contains Duplicate II
    Leetcode 890. Find and Replace Pattern
    Leetcode 965. Univalued Binary Tree
    Leetcode 700. Search in a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254859.html
Copyright © 2011-2022 走看看