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

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

    二、模式结构成员构成

    • Mediator: 抽象中介者

    • ConcreteMediator: 具体中介者

    • Colleague: 抽象同事类

    • ConcreteColleague: 具体同事类

    三.代码示例
      1 /**
      2  * Colleague
      3  * 抽象同事类
      4  */
      5 public abstract class AbstractColleague {
      6     protected int number;
      7 
      8     public int getNumber() {
      9         return number;
     10     }
     11 
     12     public void setNumber(int number) {
     13         this.number = number;
     14     }
     15 
     16     //注意这里的参数不再是同事类,而是一个中介者
     17     public abstract void setNumber(int number, AbstractMediator am);
     18 }
     19 
     20 /**
     21  * ConcreteColleague
     22  * 具体同事类
     23  */
     24 public class ColleagueA extends AbstractColleague {
     25 
     26     @Override
     27     public void setNumber(int number, AbstractMediator am) {
     28         this.number = number;
     29         am.AaffectB();
     30     }
     31 
     32 }
     33 
     34 /**
     35  * ConcreteColleague
     36  * 具体同事类
     37  */
     38 public class ColleagueB extends AbstractColleague{
     39  
     40     @Override
     41     public void setNumber(int number, AbstractMediator am) {
     42         this.number = number;
     43         am.BaffectA();
     44     }
     45 }
     46 
     47 /**
     48  * Mediator
     49  * 抽象中介者
     50  */
     51 public abstract class AbstractMediator {
     52     protected AbstractColleague A;
     53     protected AbstractColleague B;
     54     
     55     public AbstractMediator(AbstractColleague a, AbstractColleague b) {
     56         A = a;
     57         B = b;
     58     }
     59  
     60     public abstract void AaffectB();
     61     
     62     public abstract void BaffectA();
     63  
     64 }
     65 
     66 /**
     67  * ConcreteMediator
     68  * 具体中介者
     69  */
     70 class Mediator extends AbstractMediator {
     71 
     72     public Mediator(AbstractColleague a, AbstractColleague b) {
     73         super(a, b);
     74     }
     75 
     76     //处理A对B的影响
     77     @Override
     78     public void AaffectB() {
     79         int number = A.getNumber();
     80         B.setNumber(number * 100);
     81     }
     82 
     83     //处理B对A的影响
     84     @Override
     85     public void BaffectA() {
     86         int number = B.getNumber();
     87         A.setNumber(number / 100);
     88     }
     89 }
     90 
     91 /**
     92  * client
     93  */
     94 public class Client {
     95     public static void main(String[] args){
     96         AbstractColleague collA = new ColleagueA();
     97         AbstractColleague collB = new ColleagueB();
     98         
     99         AbstractMediator am = new Mediator(collA, collB);
    100         
    101         System.out.println("==========通过设置A影响B==========");
    102         collA.setNumber(1000, am);
    103         System.out.println("collA的number值为:"+collA.getNumber());
    104         System.out.println("collB的number值为A的10倍:"+collB.getNumber());
    105  
    106         System.out.println("==========通过设置B影响A==========");
    107         collB.setNumber(1000, am);
    108         System.out.println("collB的number值为:"+collB.getNumber());
    109         System.out.println("collA的number值为B的0.1倍:"+collA.getNumber());
    110         
    111     }
    112 }
    View Code
    四.优点和缺点分析
    优点:
    >简化了对象之间的交互
    >将各同事解耦

    缺点:
    >可能会导致中介者对象非常复杂,使得系统难以维护。
     
    五.应用场景
    >想通过一个中间类来封装多个类中的行为

    >系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。

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

  • 相关阅读:
    钉钉h5二次分享
    几种 JavaScript 动画库推荐
    Vue监听浏览器窗口大小发生变化触发的事件
    git将本地项目关联远程仓库并上传到新分支
    初识Node.js与内置模块
    Ajax
    关于linux环境下解 npm install卡在checking installable status(这一篇就够了)
    解决使用element-ui的el-table组件显示树形数据时,多选框全选无法选中全部节点问题
    视频防盗链是如何实现的?
    g2 plot柱状图的简单使用
  • 原文地址:https://www.cnblogs.com/756623607-zhang/p/9251091.html
Copyright © 2011-2022 走看看