设计模式 | 中介者模式/调停者模式(Mediator)
定义:
用一个中介对象来封装以系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地变化他们之间的交互。
结构:(书中图,侵删)
一个抽象中介者
若干具体中介者
一个抽象同事类
若干个具体同事类
实例:
我觉得git就相当于一个中介者,用户之间不用互相认识,但是可以互相改代码。
抽象中介接口:
package designpattern.mediator; public interface Mediator { public void commit(String memo, User sender); }
用户类(抽象同事类):
package designpattern.mediator; public abstract class User { protected Mediator mediator; public User(Mediator mediator) { this.mediator = mediator; } }
仓库所有者类(具体同事类):
package designpattern.mediator; public class Owner extends User { public Owner(Mediator mediator) { super(mediator); } public void commit(String memo) { mediator.commit(memo, this); } public void receive(String memo) { System.out.println("所有者收到信息:" + memo); } }
开发者类(具体同事类):
package designpattern.mediator; public class Developer extends User { public Developer(Mediator mediator) { super(mediator); } public void commit(String memo) { mediator.commit(memo, this); } public void receive(String memo) { System.out.println("开发者收到信息:" + memo); } }
GitHub类(具体中介者类):
package designpattern.mediator; public class GitHub implements Mediator { Owner owner; Developer developer; public void setOwner(Owner owner) { this.owner = owner; } public void setDeveloper(Developer developer) { this.developer = developer; } @Override public void commit(String memo, User sender) { if (sender == owner) { developer.receive(memo); } else { owner.receive(memo); } } }
客户端:
package designpattern.mediator; public class Client { public static void main(String[] args) { GitHub gitHub = new GitHub(); Owner owner = new Owner(gitHub); Developer developer = new Developer(gitHub); gitHub.setOwner(owner); gitHub.setDeveloper(developer); owner.commit("我新建了一个项目"); developer.commit("我帮你改了一个BUG"); } }
结果输出:
开发者收到信息:我新建了一个项目
所有者收到信息:我帮你改了一个BUG
总结:
虽然解耦了同事类,但他们和中介类的耦合挺紧密的,并且每新增一个类,中介类都要相应修改。对于复杂系统来说,中介类会过于的复杂。
所以要谨慎使用这个模式。
书中提到的适用场景:
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合(比如一个程序窗体(中介者)之于其中的各种组件(按钮、菜单、显示框等同事类))
以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。