经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
行为模式之中介者模式
来源:cnblogs  作者:yewen1234  时间:2018/12/3 10:09:09  对本文有异议

中介模式(Mediator)也称调停者模式,是一种比较简单的模式。

定义:

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

抽象中介者类图如下:

 

中介者模式有以下4个角色:

  • 抽象中介者(Mediator)角色:定义统一的接口,用于各同事角色之间的通信。
  • 具体中介者(Concrete Mediator)角色:该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为。
  • 抽象同事(Colleague)角色:该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象。
  • 具体同事(Concrete Colleague)角色:该角色实现抽象同事类,每一个同事角色都知道中介者角色,且与其他同事角色通信时,一定要通过中介者角色协作。

Mediator.java

  1. public abstract class Mediator {
  2. // 定义同事类
  3. protected ConcreteColleague1 c1;
  4. protected ConcreteColleague2 c2;
  5. // 通过getter/setter方法注入同事类
  6. protected ConcreteColleague1 getC1() {
  7. return c1;
  8. }
  9. protected void setC1(ConcreteColleague1 c1) {
  10. this.c1 = c1;
  11. }
  12. protected ConcreteColleague2 getC2() {
  13. return c2;
  14. }
  15. protected void setC2(ConcreteColleague2 c2) {
  16. this.c2 = c2;
  17. }
  18. // 中介者的业务逻辑
  19. public abstract void doSomething1();
  20. public abstract void doSomething2();
  21. }

ConcreteMediator.java

  1. public class ConcreteMediator extends Mediator {
  2. @Override
  3. public void doSomething1() {
  4. // 调用同事类的方法,只要是public方法都可以调用
  5. super.c1.selfMethod1();
  6. super.c2.selfMethod2();
  7. }
  8. @Override
  9. public void doSomething2() {
  10. super.c1.selfMethod1();
  11. super.c2.selfMethod2();
  12. }
  13. }

Colleague.java

  1. public abstract class Colleague {
  2. protected Mediator mediator;
  3. public Colleague(Mediator mediator) {
  4. this.mediator = mediator;
  5. }
  6. }

ConcreteColleague1.java

  1. public class ConcreteColleague1 extends Colleague {
  2. // 通过构造函数传递中介者
  3. public ConcreteColleague1(Mediator mediator) {
  4. super(mediator);
  5. }
  6. // 自有方法 self-method
  7. public void selfMethod1() {
  8. }
  9. // 依赖方法 dep-method
  10. public void depMethod1() {
  11. // 处理自己的业务逻辑
  12. // 自己不能处理的业务逻辑,委托给中介者处理
  13. super.mediator.doSomething1();
  14. }
  15. }

ConcreteColleague2.java

  1. public class ConcreteColleague2 extends Colleague {
  2. public ConcreteColleague2(Mediator mediator) {
  3. super(mediator);
  4. }
  5. // 自有方法 self-method
  6. public void selfMethod2() {
  7. }
  8. // 依赖方法 dep-method
  9. public void depMethod2() {
  10. // 处理自己的业务逻辑
  11. // 自己不能处理的业务逻辑,委托给中介者处理
  12. super.mediator.doSomething2();
  13. }
  14. }

优点:

  • 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,使得对象之间的关系更易维护和理解。
  • 避免同事之间过度耦合,同事类只依赖中介者,使同事类更易被复用,中介类和同事类可以相互独立的演化。
  • 中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理。

缺点:

  • 增加了中介者类的复杂性。
  • 中介者类经常充满了各个具体同事类的关系协调代码,这种代码是不能复用的。

注意事项:

  • 不应在责任划分混乱时使用。责任分割的混乱会使系统中的对象与对象之间产生不适当的复杂关系。
  • 不应当对数据类和方法类使用。
  • 正确理解封装。封装首先是行为,以及行为所涉及的状态的封装。行为与状态是不应该分割开的。中介者模式的用途是管理很多对象的相互作用,以便使这些对象专注于自身行为。

引用:

青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,142-146.

秦小波 . 设计模式之禅 . 机械工业出版社, 2014 , 254-256

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号