模式的定义与特点
中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
主要优点如下
主要缺点是
中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。
模式的结构与实现
中介者模式实现的关键是找出“中介者”,下面对它的结构和实现进行分析。
1. 模式的结构
示例1,使用interface接口实现方式
/** * @descript 这是一个中介者类 * 作用1 注册同事类 * 作用2 负责同事类之前的转发工作 * @author 79197 */public interface Intermediary01 {public void register(Colleague01 colleague);public void transmit(Colleague01 colleague);}public class Intermediary01Implement implements Intermediary01{private List colleagueObj=new ArrayList();//注册同事类public void register(Colleague01 colleague) {if(!colleagueObj.contains(colleague)) {colleague.setIntermediary01(this);colleagueObj.add(colleague);}}//转发public void transmit(Colleague01 colleague) {for(Colleague01 obj:colleagueObj) {if(!obj.equals(colleague) && !obj.typeobString.equals(colleague.typeobString)) {obj.receive(colleague.send());}}}}/** * @descript 这是一个同事类 * 作用1 定义不同各类,方便区分同事类 * 作用2 聚合中介者类 * 作用3 定义和其它同事类交互的类,即发送消息的类 * 作用4 定义接收其它同事类 * @author 79197 */abstract class Colleague01 {protected Intermediary01 intermediary01;String typeobString;String nameString;String sendStringparameter;public String getSendStringparameter() {return sendStringparameter;}public void setSendStringparameter(String sendStringparameter) {this.sendStringparameter = sendStringparameter;}public Colleague01(String typeobStringparameter,String nameStringparameter) {typeobString=typeobStringparameter;nameString=nameStringparameter;}public void setIntermediary01(Intermediary01 intermediary01temp) {this.intermediary01=intermediary01temp;}public abstract String send();public abstract void receive(String sendcontext);}public class Colleague01A extends Colleague01{public Colleague01A(String typeobStringparameter,String nameStringparameter) {super(typeobStringparameter, nameStringparameter);}String sendStringparameter;public String getSendStringparameter() {return sendStringparameter;}public void setSendStringparameter(String sendStringparameter) {this.sendStringparameter = sendStringparameter;}@Overridepublic String send() {System.out.println(“我是”+super.typeobString+”方,昵称是:”+super.nameString+”Colleague01B:发送信息是:”+getSendStringparameter());return “我是”+super.typeobString+”方,昵称是:”+super.nameString+”Colleague01A:发送信息是:”+getSendStringparameter();}@Overridepublic void receive(String sendcontext) {System.out.println(“我是”+this.typeobString+”方,昵称是:”+this.nameString+”Colleague01A:接口信息是:”+sendcontext);}}public class Colleague01B extends Colleague01{public Colleague01B(String typeobStringparameter,String nameStringparameter) {super(typeobStringparameter, nameStringparameter);}String sendStringparameter;public String getSendStringparameter() {return sendStringparameter;}public void setSendStringparameter(String sendStringparameter) {this.sendStringparameter = sendStringparameter;}@Overridepublic String send() {System.out.println(“我是”+super.typeobString+”方,昵称是:”+super.nameString+”Colleague01B:发送信息是:”+getSendStringparameter());return “我是”+super.typeobString+”方,昵称是:”+super.nameString+”Colleague01B:发送信息是:”+getSendStringparameter();}@Overridepublic void receive(String sendcontext) {System.out.println(“我是”+super.typeobString+”方,昵称是:”+super.nameString+”Colleague01B:接口信息是:”+sendcontext);}}public class Colleague01C extends Colleague01{public Colleague01C(String typeobStringparameter,String nameStringparameter) {super(typeobStringparameter, nameStringparameter);}String sendStringparameter;public String getSendStringparameter() {return sendStringparameter;}public void setSendStringparameter(String sendStringparameter) {this.sendStringparameter = sendStringparameter;}@Overridepublic String send() {System.out.println(“我是”+super.typeobString+”方,昵称是:”+super.nameString+”Colleague01B:发送信息是:”+getSendStringparameter());return “我是”+super.typeobString+”方,昵称是:”+super.nameString+”Colleague01A:发送信息是:”+getSendStringparameter();}@Overridepublic void receive(String sendcontext) {System.out.println(“我是”+super.typeobString+”方,昵称是:”+super.nameString+”Colleague01A:接口信息是:”+sendcontext);}}
测试类
public class IntermediaryTest {public static void main(String[] args) {Colleague01 sellerObj=new Colleague01A(“链家卖方”,”小明”);//sellerObj.setSendStringparameter(“长安街有一套上好的房源,正规3室一厅,感兴趣的朋友可以私聊……”);Colleague01 buyerObj1=new Colleague01B(“业主”,”小张”);Colleague01 buyerObj2=new Colleague01C(“业主”,”小李”);buyerObj1.setSendStringparameter(“想购买一套房子”);Intermediary01 mediaryObj=new Intermediary01Implement();mediaryObj.register(sellerObj);mediaryObj.register(buyerObj1);mediaryObj.register(buyerObj2);mediaryObj.transmit(buyerObj1);}}
示例2 抽象类的实现方式
/** * @descript 这是一个中介者类 * 作用1 注册同事类 * 作用2 负责同事类之前的转发工作 * @author 79197 */abstract class Intermediary01 {abstract void register(Colleague01 colleague);abstract void transmit(Colleague01 colleague);}public class Intermediary01Implement extends Intermediary01{private List colleagueObj=new ArrayList();//注册同事类public void register(Colleague01 colleague) {if(!colleagueObj.contains(colleague)) {colleague.setIntermediary01(this);colleagueObj.add(colleague);}}//转发public void transmit(Colleague01 colleague) {for(Colleague01 obj:colleagueObj) {if(!obj.equals(colleague) && !obj.typeobString.equals(colleague.typeobString)) {obj.receive(colleague.send());}}}}