设计模式-中介者模式
定义:用一个中介者对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互。角色:中介者模式有如下角色:Mediator中介者定义一个接口用于与各同事(Colleague)对象通信。ConcreteMediator具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。Colleague抽...
·
定义:
用一个中介者对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互。
角色:
中介者模式有如下角色:
- Mediator
中介者定义一个接口用于与各同事(Colleague)对象通信。 - ConcreteMediator
具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。 - Colleague
抽象同事类。 - Colleagueclass
具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者
代码实现:
public abstract class Mediator {
public abstract void notice(String content,Colleague coll);
}
public abstract class Colleague {
protected String name;
protected Mediator mediator;
public Colleague(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
public class ColleagueA extends Colleague {
public ColleagueA(String name, Mediator mediator) {
super(name, mediator);
}
public void getNotice(String message){
System.out.println("同事A"+name+"获得信息"+message);
}
//同事A与中介者通信
public void contact(String message){
mediator.notice(message, this);
}
}
public class ColleagueB extends Colleague {
public ColleagueB(String name, Mediator mediator) {
super(name, mediator);
}
public void getNotice(String message){
System.out.println("同事B"+name+"获得信息"+message);
}
//同事B与中介者通信
public void contact(String message){
mediator.notice(message, this);
}
}
@Data
public class ConcreteMediator extends Mediator {
ColleagueA collA;
ColleagueB collB;
@Override
public void notice(String content, Colleague coll) {
if (coll == collA) {
collB.getNotice(content);
} else {
collA.getNotice(content);
}
}
}
public class Client {
// 中介者,ColleagueA、ColleagueB
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ColleagueA colleagueA = new ColleagueA("A", mediator);
ColleagueB colleagueB = new ColleagueB("B", mediator);
mediator.setCollA(colleagueA);
mediator.setCollB(colleagueB);
colleagueA.contact("我是A,我要联系B!");
colleagueB.contact("我是B,收到A消息!");
}
}
总结
中介者模式简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。并且提供系统的灵活性,使得各个同事对象独立而易于复用。
其缺点也很明显:
- 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
- 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。
中介者模式适用于当对象之间的交互变多时,为了防止一个类会涉及修改其他类的行为,可以使用中介者模式,将系统从网状结构变为以中介者为中心的星型结构。
vs 外观模式
外观模式主要是以封装和隔离为主要任务,中介者则是协调同事类之间的关系,因此,中介者具有部分业务的逻辑控制。他们之间的主要区别为:
- 外观模式的子系统如果脱离外观模式还是可以运行的,而中介者模式增加了业务逻辑,同事类不能脱离中介者而独自存在。
- 外观模式将子系统的逻辑隐藏,用户不知道子系统的存在,而中介者模式中,用户知道同事类的存在。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)