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 }
四.优点和缺点分析
优点:
>简化了对象之间的交互
>将各同事解耦
缺点:
>可能会导致中介者对象非常复杂,使得系统难以维护。
五.应用场景
>想通过一个中间类来封装多个类中的行为
>系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
>一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。