夜光序言:
她注视着他的脸欣赏了好久,像黄昏的天色那样温柔和明朗。
正文:
以道御术 / 以术识道
中介者模式(Mediator)的定义
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式(Mediator)的适用性
1.一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
3.想定制一个分布在多个类中的行为,但又不想生成太多的子类。
中介者模式(Mediator)的参与者
1.Mediator
中介者定义一个接口用于与各同事(Colleague)对象通信。
2.ConcreteMediator
具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。
3.Colleague:
抽象同事类。
4.Colleagueclass
具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者
package 中介者模式.智能家庭;
//第一步:夜光 定义Mediator
public abstract class Mediator {
//定义抽象Mediator,可以与萧炎和林动进行联络
public abstract void contact(String content,Colleague coll);
}
package 中介者模式.智能家庭;
//夜光
//第二步:定义抽象Colleague
public abstract class Colleague {
protected String name; //protected 只有继承的子类可以使用
protected Mediator mediator; //protected 只有继承的子类可以使用
public Colleague(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
package 中介者模式.智能家庭;
//第三步:定义具体Colleagueclass ColleagueA
public class ColleagueA extends Colleague {
// 具体同事类继承自Colleague,此刻就可以与中介者mediator进行通信了
public ColleagueA(String name, Mediator mediator) {
super(name, mediator);
}
public void getMessage(String message){
System.out.println("大千世界"+name+"获得信息"+message);
}
//这个类与中介者通信
public void contact(String message){
mediator.contact(message, this);
}
}
package 中介者模式.智能家庭;
//第三步:定义具体Colleagueclass ColleagueB
public class ColleagueB extends Colleague {
public ColleagueB(String name, Mediator mediator) {
super(name, mediator);
}
public void getMessage(String message){
System.out.println("大千世界"+name+"获得信息"+message);
}
//这个类与中介者通信
public void contact(String message){
mediator.contact(message, this);
}
}
package 中介者模式.智能家庭;
//夜光:第四步
//定义具体中介者ConcreteMediator,具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。
public class ConcreteMediator extends Mediator {
ColleagueA collA;
ColleagueB collB;
public ColleagueA getCollA() {
return collA;
}
public void setCollA(ColleagueA collA) {
this.collA = collA;
}
public ColleagueB getCollB() {
return collB;
}
public void setCollB(ColleagueB collB) {
this.collB = collB;
}
@Override
public void contact(String content, Colleague coll) {
if (coll==collA) {
collB.getMessage(content);
} else {
collA.getMessage(content);
}
}
}
package 中介者模式.智能家庭;
//第五步:定义Client
public class Client {
// 中介者,ColleagueA、ColleagueB
public static void main(String[] args) {
// 定义中介者
ConcreteMediator mediator = new ConcreteMediator();
// 定义具体同事类
ColleagueA colleagueA = new ColleagueA("林动", mediator);
ColleagueB colleagueB = new ColleagueB("萧炎", mediator);
// 中介者知晓每一个具体的Colleague类
mediator.setCollA(colleagueA);
mediator.setCollB(colleagueB);
colleagueA.contact("我是萧炎,我要和同事林动说说工作的事情");
colleagueB.contact("我是林动,我下午有时间,下午商量吧");
}
}