博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
行为型模式之中介者模式
阅读量:4987 次
发布时间:2019-06-12

本文共 3133 字,大约阅读时间需要 10 分钟。

GitHub地址:
 
一.定义
  中介者模式(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

 

四.优点和缺点分析
优点:
>简化了对象之间的交互
>将各同事解耦
缺点:
>可能会导致中介者对象非常复杂,使得系统难以维护。
 
五.应用场景
>想通过一个中间类来封装多个类中的行为

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

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

 

转载于:https://www.cnblogs.com/756623607-zhang/p/9251091.html

你可能感兴趣的文章
linux一些基本常识(四)
查看>>
Docker架构
查看>>
C#设计模式(3)——工厂方法模式
查看>>
过目不忘JS正则表达式
查看>>
Colidity-- StoneWall
查看>>
Leetcode 904. Fruit Into Baskets
查看>>
怎样连接REDIS服务端
查看>>
No.026:Remove Duplicates from Sorted Array
查看>>
SpringBoot项目的几种创建方式,启动、和访问
查看>>
解决"disabled". Expected Boolean, got Number with value 0
查看>>
OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序
查看>>
Exponentiation
查看>>
本地jar上传到本地仓库
查看>>
四则运算C++带Qt界面版本,吾王镇楼。。。。。
查看>>
安卓7.0手机拍照闪退问题解决
查看>>
ME525+ Defy+ 刷机指南[zz]
查看>>
支持触屏的jQuery轮播图插件
查看>>
差一点搞混了Transactional注解
查看>>
javascript基本函数
查看>>
前端公共库cdn服务推荐//提高加载速度/节省流量
查看>>