中介者模式
中介者模式(Mediator):用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
对于定义的理解就好比发短信一样先要经过运营商的服务器(移动、电信等)然后在发到目标的手机上
但是运营商有移动、联通、电信等等很多,手机也有无数个品牌,所以这里就抽出了抽象的运营商和手机加上下面的各自的子类就组成了中介者基本的结构
抽象中介者(Mediator):抽象中介者,好比运营商。
具体中介者(Concrete Mediator): 具体的中介者负责协调传递,必须知道所有的具体角色也就是例子里的手机。
抽象手机(Moble Phone) : 为所有的手机定义公共的方法。
具体手机 (Concrete Moble): 就是各个牌子的手机了。例如小米、华为等。
他们的UML图还是一样就借用大话设计模式的图:
抽象同事就是我的例子里的抽象手机类,同样下面实现也是具体手机
代码实现
//抽象运营商
abstract class Mediator{
public abstract void send(String message,String num);
}
//抽象手机
abstract class MoblePhone{
private Mediator mediator;
public String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public MoblePhone(Mediator mediator){
this.mediator=mediator;
}
public Mediator getMediator() {
return mediator;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void call(String message,String num);
}
//真实的运营商
class ConcreteMediator extends Mediator{
//拥有所有的真实角色
private MoblePhone iphone;
private MoblePhone mi5;
public void setIphone(MoblePhone iphone) {
this.iphone = iphone;
}
public void setMi5(MoblePhone mi5) {
this.mi5 = mi5;
}
@Override
public void send(String message, String num) {
if("15812312312".equals(num)){
iphone.setMessage(message);
}else{
mi5.setMessage(message);
}
}
}
class Iphone extends MoblePhone{
public Iphone(Mediator mediator) {
super(mediator);
}
@Override
public void call(String message,String num) {
super.getMediator().send(message, num);
}
public void dis(){
System.out.println(super.getMediator());
}
}
class Mi5 extends MoblePhone{
public Mi5(Mediator mediator) {
super(mediator);
}
@Override
public void call(String message,String num) {
super.getMediator().send(message, num);
}
public void dis(){
System.out.println(super.getMediator());
}
}
public class Client {
public static void main(String[] args){
ConcreteMediator mediator=new ConcreteMediator();
//两个手机
Mi5 mi5=new Mi5(mediator);
Iphone iphone=new Iphone(mediator);
//运营商保存所有的手机
mediator.setIphone(iphone);
mediator.setMi5(mi5);
//给特定号码发短信
mi5.call("最近出去浪不", "15812312312");
System.out.println(iphone.getMessage());
//回复短信
iphone.call("不了最近浪多了吃不消了", "17712312311");
System.out.println(mi5.getMessage());
}
}
在中介者模式中中介者对象处于核心地位,因为它定义了整个系统中所有具体同事类之间的关系。在整个系统中它主要承担两个方面的责任。
结构上起到中转作用。通过中介者对象对关系的封装,使得具体的同事类不再需要显示的引用其他对象,它只需要通过中介者就可以完成与其他同事类之间的通信。
行为上起到协作作用。中介者对同事类之间的关系进行封装,同事类在不需要知道其他对象的情况下通过中介者与其他对象完成通信。在这个过程中同事类是不需要指明中介者该如何做,中介者可以根据自身的逻辑来进行协调,对同事的请求进一步处理,将同事成员之间的关系行为进行分离和封装。
同时由于中介者对对象的关系进行了封装,使得各个同事类之间的耦合减少了,使得他们可以独立改变和复用。