中介者模式
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
中介者模式解决的问题
对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
中介者模式角色
抽象中介者(Mediator)角色:它是中介者的接口,提供了合作者对象注册与转发合作者对象信息的抽象方法。
具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理合作者对象,协调各个合作者角色之间的交互关系,因此它依赖于合作者角色。
抽象合作者类(Colleague)角色:定义合作者类的接口,保存中介者对象,提供合作者对象交互的抽象方法,实现所有相互影响的合作者类的公共功能。
具体合作者类(Concrete Colleague)角色:是抽象合作者类的实现者,当需要与其他合作者对象交互时,由中介者对象负责后续的交互。
代码实现
/** * @author zengjianlu * @date 2019/5/15 * 合作者 */public abstract class BaseColleague {
Mediator mediator;
String name;
Integer type;
public Integer getType() { return type; }
public void setType(Integer type) { this.type = type; }
public Mediator getMediator() { return mediator; }
public String getName() { return name; }
/** * 发布消息 * * @param content */ abstract void sendMessage(String content);
/** * 接收消息 * * @param content */ abstract void acceptMessage(String content);}
/** * @author zengjianlu * @date 2019/5/15 * * 合作者类型 */public enum ColleagueType { /** * 租客类型 */ TENANT(1), /** * 房东类型 */ LANDORD(2); private Integer value;
ColleagueType(Integer value) { this.value = value; }
public Integer getValue() { return value; }
}
/** * @author zengjianlu * @date 2019/5/15 * 租客 */public class Tenant extends BaseColleague {
public Tenant(Mediator mediator, String name) { this.mediator = mediator; this.name = name; this.type = ColleagueType.TENANT.getValue(); }
@Override public void sendMessage(String content) { System.out.println(this.name + "发布消息:" + content); mediator.notifyOtherColleague(this, content); }
@Override void acceptMessage(String content) { System.out.println(this.name + ":" + "接收来自中介的消息:" + content); }
}
/** * @author zengjianlu * @date 2019/5/15 * 中介 */public interface Mediator { /** * 添加合作者 * @param baseColleague * @return */ Mediator addColleague(BaseColleague baseColleague);
/** * 通知其他合作者 * @param baseColleague * @param content */ void notifyOtherColleague(BaseColleague baseColleague, String content);}
/** * @author zengjianlu * @date 2019/5/15 * 房屋中介 */public class HouseMediator implements Mediator{
List<BaseColleague> baseColleagues = new ArrayList<BaseColleague>();
@Override public Mediator addColleague(BaseColleague baseColleague) { baseColleagues.add(baseColleague); return this; }
@Override public void notifyOtherColleague(final BaseColleague baseColleague, String content) { final String translateContent = baseColleague.getName() + content; if(!baseColleagues.isEmpty()){ List<BaseColleague> others = baseColleagues.stream() .filter(x->!baseColleague.getType().equals(x.getType())).collect(Collectors.toList()); if(others.isEmpty()){ return; } others.stream().forEach(x->{ x.acceptMessage(translateContent); }); } }}
/** * @author zengjianlu * @date 2019/5/15 */public class Test { public static void main(String[] args) { Mediator mediator = new HouseMediator(); BaseColleague dada = new Tenant(mediator,"租客达达"); BaseColleague haha = new Tenant(mediator,"租客哈哈");
BaseColleague gaga = new Landlord(mediator,"房东嘎嘎"); BaseColleague hehe = new Landlord(mediator,"房东呵呵");
mediator.addColleague(dada).addColleague(haha).addColleague(gaga).addColleague(hehe);
dada.sendMessage("我要租两室一厅的房子"); haha.sendMessage("我要租三室一厅的房子");
gaga.sendMessage("我要出租两室一厅的房子"); hehe.sendMessage("我要出租三室一厅的房子");
}}
运行结果:
优缺点
优点:
降低了对象之间的耦合性,使得对象易于独立地被复用,符合迪米特原则。
将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
缺点:
当合作者类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
生活中的中介模式
房屋中介是最典型的中介模式,房东要把房子租出去,先把房源信息告诉中介,中介替他把房子租出去。租客要租房子,把自己租房子的要求告诉中介,中介从房东获得的房源信息找出符合条件的房子,介绍给租客,促进双方的交易。中介从中,双向收钱,不仅收房东的手续费,同时也收取租客的介绍费。
很多平台也属于中介模式,天猫、拼多多、美团、饿了么,都是起着连接的作用,促进商家和用户之间的交易,向用户售卖vip、向商家收取佣金。
聊天室、QQ群也属于中介模式,发消息人和接收消息人都是具体的合作者,聊天室服务器就是中介。