java 设计模式之中介者模式①⑦
.我们总是喜欢拿顺其自然来敷衍人生道路上的荆棘坎坷,却很少承认,真正的顺其自然,其实是竭尽所能之后的不强求,而非两手一摊的不作为。
设计模式学习,近期我会把23种设计模式都写成博客,敬请期待~
—2021/1/23
定义
用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
经典案例
房东 --> 中介 --> 租客 生活案例举例
比如58同城租房,房东需要吧需要出租的房屋信息提交到58同城,
租客需要去58同城上挑选自己中意的房屋来组,期间房东与租客不会交互,会通过中介来交互
假设有5个房东,需要出租5套房子,那么租客就只能在这5套中挑选合适的.
角色分析
UML类图分析(1.1):
- Mediator:抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。
- ConcreateMediator:中介者实现类:继承自抽象中介者,实现抽象中介者中定义的事件方法。
- House:同事抽象类:吧抽象中介则聚合进来,用来规范具体实现
- MasterHouse / TenantHouse : 同事类: 实现同时抽象类方法,用于实现各自的需求
为什么这里要叫同事类?
出租与租,都是一种需求,而且他们都委托给中介来管理,从某种意义上来说,也算是’同事’
代码实现
Mediator中介者抽象类:
public abstract class Mediator {
//TODO 房东
public abstract void registerMasterHouse(House house);
//移除房东
public abstract void removeMasterHouse(House house);
//租客 注册
public abstract void registerTenantHouse(House house);
//移除租客
public abstract void removeTenantHouse(House house);
}
House房屋抽象类:
public abstract class House {
//中介者抽象类
public Mediator mediator;
public House(Mediator mediator) {
this.mediator = mediator;
}
//输出消息
public abstract void sendInfo(String info);
//获取房东发送的消息 (打印消息时使用)
protected abstract String getInfo();
}
中介者具体实现:
public class ConcreateMediator extends Mediator {
//房东
private final ArrayList<House> masterList;
//租客
private final ArrayList<House> tenantList;
public ConcreateMediator() {
masterList = new ArrayList<>();
tenantList = new ArrayList<>();
}
@Override//房东注册房子
public void registerMasterHouse(House house) {
masterList.add(house);
}
@Override//房东移除房子
public void removeMasterHouse(House house) {
if (masterList.contains(house)) {
masterList.remove(house);
}
}
/**
* 打印房东消息
*/
public void printMasterHouse(){
Iterator<House> iterator = masterList.iterator();
while (iterator.hasNext()){
House next = iterator.next();
Log.i("中介者模式:","房东消息 :"+ next.getInfo());
}
}
@Override//租客 租房子
public void registerTenantHouse(House house) {
tenantList.add(house);
}
@Override//租客移除房子
public void removeTenantHouse(House house) {
if (tenantList.contains(house)) {
tenantList.remove(house);
}
}
/**
* 打印租客消息
*/
public void printTenantHouse(){
Iterator<House> iterator = tenantList.iterator();
while (iterator.hasNext()){
House next = iterator.next();
Log.i("中介者模式:","租客消息 :"+ next.getInfo());
}
}
}
MasterHouse 房东具体实现:
public class MasterHouse extends House{
private String msg = "";
public MasterHouse(Mediator mediator) {
super(mediator);
}
@Override
public void sendInfo(String info) {
this.msg = info;
mediator.registerMasterHouse(this);
}
@Override
protected String getInfo() {
return msg;
}
}
分析:
- 这里在发送消息的时候,通过调用父类中介者的注册方法,将当前状态添加到中介者的’房东’集合中; (便于之后打印,而且使用集合方便管理)
租客实现类:
public class TenantHouse extends House {
private String msg = "";
public TenantHouse(Mediator mediator) {
super(mediator);
}
@Override
public void sendInfo(String info) {
msg = info;
mediator.registerTenantHouse(this);
}
@Override
public String getInfo() {
return msg;
}
}
测试代码(客户端):
房东测试:
//中介者
ConcreateMediator concreateMediator = new ConcreateMediator();
//房东 吧房子交给中介者
MasterHouse masterHouse = new MasterHouse(concreateMediator);
MasterHouse masterHouse2 = new MasterHouse(concreateMediator);
MasterHouse masterHouse3 = new MasterHouse(concreateMediator);
//房东发送消息
masterHouse.sendInfo("北京市丰台区丰台接到幸福小区1单元1号楼 2000/月 ");
masterHouse2.sendInfo("北京市丰台区丰台接到幸福小区1单元1号楼 4000/月 ");
masterHouse3.sendInfo("北京市丰台区丰台接到幸福小区1单元1号楼 6000/月 ");
//删除房东3 的消息
concreateMediator.removeMasterHouse(masterHouse3);
//打印租客发送的消息
concreateMediator.printMasterHouse();
Log图(2.1):
租客测试:
//租客
TenantHouse tenantHouse = new TenantHouse(concreateMediator);
//租客租房子
tenantHouse.sendInfo("我想在丰台租一个一室一厅1000 - 1500元/月,年初去北京发展很急!");
//打印租客发送的消息
concreateMediator.printTenantHouse();
Log图(2.2):
如何扩展
假设我现在租房对性别要求,我是女生,我要和女生合租
WomanHouse女性租客具体实现:
public class WomanHouse extends House {
private String msg;
public WomanHouse(Mediator mediator) {
super(mediator);
}
@Override
public void sendInfo(String info) {
msg = info;
mediator.registerTenantHouse(this);
}
@Override
protected String getInfo() {
return msg;
}
}
测试代码(客户端):
//女性租客
WomanHouse womanHouse = new WomanHouse(concreateMediator);
womanHouse.sendInfo("我是女性,我想在丰台区和女性合租, 1300/月");
//打印租客发送的消息
concreateMediator.printTenantHouse();
Log图(2.3):
优点:
- 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。
- 使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护。
原创不易,您的点赞就是对我最大的支持哦~