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

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

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

类型:行为类模式

类图:

 

中介者模式的结构

 中介者模式又称为调停者模式,从类图中看,共分为3部分:

 抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。

中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类。

同事类:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。并且,同事类也可以表现为继承了同一个抽象类的一组实现组成。在中介者模式中,同事类之间必须通过中介者才能进行消息传递。

 

复杂的对象之间的关系

 

使用中介者的模型:

 

 

用一个中介对象来封装一些列的对象交互,中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式解决问题的思路很简单,就是通过引入一个中介对象,让其他对象只与中介对象交互,而中介对象知道如何和其他所有对象的交互,这样对象之间的交互关系就没有了,从而实现了对象之间的解耦。由此,我们也可以看出一个问题,那就是中介对象控制着整个系统的逻辑,它会过于复杂,这是一个缺点。

中介者模式的本质是封装交互:

(1)对象在自身状态发生改变时报告给中介对象;

(2)中介对象控制着整个系统的逻辑,它知道如何与所有对象交互;

(3)对象需要对中介对象发出的请求作出回应。

 

中介者模式的优点

适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。

使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护。

使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。

 

适用场景

只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。

可以将网状结构变为星状结构,使同事类之间的关系变的清晰一些。

 

例子:

同事类:有两个类A和B,类中各有一个数字,并且要保证类B中的数字永远是类A中数字的100倍。也就是说,当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。类A类B互相影响,就称为同事类。

代码如下:

abstract class AbstractColleague {      protected int number;        public int getNumber() {          return number;      }        public void setNumber(int number){          this.number = number;      }      //抽象方法,修改数字时同时修改关联对象      public abstract void setNumber(int number, AbstractColleague coll);  }    class ColleagueA extends AbstractColleague{      public void setNumber(int number, AbstractColleague coll) {          this.number = number;          coll.setNumber(number*100);      }  }    class ColleagueB extends AbstractColleague{            public void setNumber(int number, AbstractColleague coll) {          this.number = number;          coll.setNumber(number/100);      }  }    public class Client {      public static void main(String[] args){            AbstractColleague collA = new ColleagueA();          AbstractColleague collB = new ColleagueB();                    System.out.println("==========设置A影响B==========");          collA.setNumber(1288, collB);          System.out.println("collA的number值:"+collA.getNumber());          System.out.println("collB的number值:"+collB.getNumber());            System.out.println("==========设置B影响A==========");          collB.setNumber(87635, collA);          System.out.println("collB的number值:"+collB.getNumber());          System.out.println("collA的number值:"+collA.getNumber());      }  }

 

上面的代码中,类A类B通过直接的关联发生关系,假如我们要使用中介者模式,类A类B之间则不可以直接关联,他们之间必须要通过一个中介者来达到关联的目的。

 

abstract class AbstractColleague {      protected int number;        public int getNumber() {          return number;      }        public void setNumber(int number){          this.number = number;      }      //注意这里的参数不再是同事类,而是一个中介者      public abstract void setNumber(int number, AbstractMediator am);  }    class ColleagueA extends AbstractColleague{        public void setNumber(int number, AbstractMediator am) {          this.number = number;          am.AaffectB();      }  }    class ColleagueB extends AbstractColleague{        @Override      public void setNumber(int number, AbstractMediator am) {          this.number = number;          am.BaffectA();      }  }    abstract class AbstractMediator {      protected AbstractColleague A;      protected AbstractColleague B;            public AbstractMediator(AbstractColleague a, AbstractColleague b) {          A = a;          B = b;      }        public abstract void AaffectB();            public abstract void BaffectA();    }  class Mediator extends AbstractMediator {        public Mediator(AbstractColleague a, AbstractColleague b) {          super(a, b);      }        //处理A对B的影响      public void AaffectB() {          int number = A.getNumber();          B.setNumber(number*100);      }        //处理B对A的影响      public void BaffectA() {          int number = B.getNumber();          A.setNumber(number/100);      }  }    public class Client {      public static void main(String[] args){          AbstractColleague collA = new ColleagueA();          AbstractColleague collB = new ColleagueB();                    AbstractMediator am = new Mediator(collA, collB);                    System.out.println("==========通过设置A影响B==========");          collA.setNumber(1000, am);          System.out.println("collA的number值为:"+collA.getNumber());          System.out.println("collB的number值为A的10倍:"+collB.getNumber());            System.out.println("==========通过设置B影响A==========");          collB.setNumber(1000, am);          System.out.println("collB的number值为:"+collB.getNumber());          System.out.println("collA的number值为B的0.1倍:"+collA.getNumber());                }  }

 

虽然代码比较长,但是还是比较容易理解的,其实就是把原来处理对象关系的代码重新封装到一个中介类中,通过这个中介类来处理对象间的关系。

 

转载于:https://www.cnblogs.com/ghp520/p/6486540.html

你可能感兴趣的文章
实战PHP数据结构基础之栈
查看>>
大数据与云计算的关系,Hadoop、Nosql如何参与其中?
查看>>
HTML5拖放的详解以及实例分享
查看>>
阿里巴巴前端工程师一面二面三面终面面经总结
查看>>
Python正则表达式初识(七)
查看>>
Cocos Creator踩坑日记(一)
查看>>
webpack之代码拆分
查看>>
.NET Core容器化@Docker
查看>>
(1)Linux性能调优之Linux进程管理
查看>>
每周一个 Python 模块 | operator
查看>>
【Android视图效果】仿QQ空间滑动改变标题栏颜色
查看>>
Synchronized原理
查看>>
服务化改造实践(三) | Dubbo + Zipkin
查看>>
Mysql 隔离级别
查看>>
图片加载之SDWebImage(上)
查看>>
iOS逆向之旅(进阶篇) — 代码注入
查看>>
Xcode 创建自定义模板
查看>>
非常经典的Java编程面试题!
查看>>
LeetCode38.报数
查看>>
使用pytesseract识别简单验证码
查看>>