中介这个词并不陌生,就是房屋中介的那个“中介”,就是中间人的意思。比如mvc模式,c(controller控制器)是m(model模型)和v(view视图)的中介者,在前后端交互时起到了中间人的作用。
中介者模式(mediator),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。uml结构图如下:
其中,mediator是抽象中介者,定义了同事对象到中介者对象的接口;colleague是抽象同事类;concretemediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令;concretecolleague是具体同事类,每个具体同事只知道自己的行为,而不了解其它同事类的情况,但它们却都认识中介者对象。
抽象中介者角色定义统一的接口,用于各同事角色之间的通信。
1 public abstract class mediator { 2 3 //抽象的发送消息方法 4 public abstract void send(string message, colleague colleague); 5 6 }
每一个同事角色都知道中介者角色,而且与其它的同事角色通信的时候,一定要通过中介者角色协作。每个同事类的行为分两种:一种是同事本身行为,比如改变对象本身的状态,处理自己的行为等,这种行为叫做自发行为,与其它同事类或者中介者没有任何依赖;第二种是必须依赖中介者才能完成的行为,叫做依赖方法。
1 public abstract class colleague { 2 3 protected mediator mediator; 4 5 public colleague(mediator mediator) { 6 this.mediator = mediator; 7 } 8 9 }
具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色。
1 public class concretemediator extends mediator { 2 3 private concretecolleague1 colleague1; 4 private concretecolleague2 colleague2; 5 6 public void setcolleague1(concretecolleague1 colleague1) { 7 this.colleague1 = colleague1; 8 } 9 10 public void setcolleague2(concretecolleague2 colleague2) { 11 this.colleague2 = colleague2; 12 } 13 14 @override 15 public void send(string message, colleague colleague) { 16 if(colleague == colleague1) { 17 colleague2.notify(message); 18 } else { 19 colleague1.notify(message); 20 } 21 } 22 23 }
这里以concretecolleague1为例,concretecolleague2不再赘述。
1 public class concretecolleague1 extends colleague { 2 3 public concretecolleague1(mediator mediator) { 4 super(mediator); 5 } 6 7 public void send(string message) { 8 mediator.send(message, this); 9 } 10 11 public void notify(string message) { 12 system.out.println("同事1得到消息:" + message); 13 } 14 15 }
首先创建一个具体中介者对象,然后实例化两个具体同事类并与该中介者进行绑定,colleague1与colleague2通过中介者发送信息。
1 public class client { 2 3 public static void main(string[] args) { 4 concretemediator mediator = new concretemediator(); 5 6 concretecolleague1 colleague1 = new concretecolleague1(mediator); 7 concretecolleague2 colleague2 = new concretecolleague2(mediator); 8 9 mediator.setcolleague1(colleague1); 10 mediator.setcolleague2(colleague2); 11 12 colleague1.send("nice to meet u."); 13 colleague2.send("nice to meet u too."); 14 } 15 16 }
运行结果如下:
上面我们有提到,联合国作为一个由各国代表组成,用来维护国际和平与安全,解决国际间经济、社会、文化和人道主义性质的问题的角色,它就是一个调停者、中介者的角色,国与国直接完全完全可以通过“联合国”这个中介者来发生关系,而不用直接通信。
下面就以联合国安理会作为中介者,了解一下中介者模式。uml图如下:
抽象中介者。
1 public abstract class unitednations { 2 3 public abstract void declare(string message, country country); 4 5 }
抽象国家类,需声明中介者角色。
1 public class country { 2 3 protected unitednations unitednations; 4 5 public country(unitednations unitednations) { 6 this.unitednations = unitednations; 7 } 8 9 }
具体国家类,继承了抽象国家类。这里以usa类为例,iraq类不再赘述。
1 public class usa extends country { 2 3 public usa(unitednations unitednations) { 4 super(unitednations); 5 } 6 7 public void declare(string message) { 8 unitednations.declare(message, this); 9 } 10 11 public void getmessage(string message) { 12 system.out.println("美国获得对方信息:" + message); 13 } 14 15 }
具体中介者角色,继承抽象中介者,重写其declare()方法,对不同国家发送不同信息。
1 public class unitednationssecuritycouncil extends unitednations { 2 3 private usa usa; 4 private iraq iraq; 5 6 public void setusa(usa usa) { 7 this.usa = usa; 8 } 9 10 public void setiraq(iraq iraq) { 11 this.iraq = iraq; 12 } 13 14 @override 15 public void declare(string message, country country) { 16 if(country == usa) { 17 iraq.getmessage(message); 18 } else { 19 usa.getmessage(message); 20 } 21 } 22 23 }
实例化一个联合国安理会对象,两国通过联合国安理会进行对话。
1 public class client { 2 3 public static void main(string[] args) { 4 5 unitednationssecuritycouncil unsc = new unitednationssecuritycouncil(); 6 7 usa usa = new usa(unsc); 8 iraq iraq = new iraq(unsc); 9 10 unsc.setusa(usa); 11 unsc.setiraq(iraq); 12 13 usa.declare("不准研制核武器"); 14 iraq.declare("我们没有核武器"); 15 } 16 17 }
运行结果如下:
源码地址:https://gitee.com/adamjiangwh/gof
如对本文有疑问, 点击进行留言回复!!
网友评论