中介者模式 Mediator

中介者模式

用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。如下图所示,使交流的双方都不互相依赖,都与中介者产生关系
在这里插入图片描述

举一个具体的例子,如果没有中介,那么租客与房东只能一对一交流,需要先预约对方,交流不是很方便
在这里插入图片描述

有中介参与后,房东和租客都与中介交流,关系变得简单一些

在这里插入图片描述

实现

采用中介者模式,类图关系

  1. Person依赖于Mediator
  2. Mediator与Person是组合关系
    在这里插入图片描述
    Person接口定义
public abstract class Person {
	protected String name;
	private Mediator mediator;

	Person(String name, Mediator mediator) {
		this.name = name;
		this.mediator = mediator;
		mediator.register(name, this);
	}
	
	public void constact(String to, String message) {
		mediator.control(name, to, message);
	}
	
	public abstract void receiveMessage(String message);
}

Mediator接口定义

public abstract class Mediator {
	protected Map<String, Person> persons = new HashMap<>();
	
	public void register(String key, Person person) {
		persons.put(key, person);
	}
	
	public void unregister(String key) {
		persons.remove(key);
	}
	
    public abstract void control(String from, String to, String message);
}

Person接口实现

租客

public class Tenant extends Person {
	Tenant(String name, Mediator mediator) {
		super(name, mediator);
	}
	
	@Override
	public void receiveMessage(String message) {
        System.out.println("租房者(" + name +")收到信息内容:" + message);
    }
}

房东

public class HouseOwner extends Person {

	HouseOwner(String name, Mediator mediator) {
		super(name, mediator);
	}

	@Override
	public void receiveMessage(String message) {
		System.out.println("房主(" + name +")收到信息内容:" + message);
	}
}

中介实现

public class MediatorStructure extends Mediator {
	@Override
	public void control(String from, String to, String message) {
		System.out.println(String.format("中介者转发消息, %s ====> %s", from, to));
		Person toPerson = persons.get(to);
		
		if (toPerson == null) {
			System.out.println("中介者转发消息失败," + to + "不在线");
			return;
		}
		
		// 调用参与者的任意方法
		toPerson.receiveMessage(message);
	}
}

测试类

public class MediatorTest {
	public static void main(String[] args) {
        //一个房主、一个租房者、一个中介机构
        MediatorStructure mediator = new MediatorStructure();
        
        //房主和租房者只需要知道中介机构即可
        HouseOwner houseOwner = new HouseOwner("张三", mediator);
        Tenant tenant = new Tenant("李四", mediator);
        Tenant tenant2 = new Tenant("王五", mediator);
        
        tenant.constact("张三", "听说你那里有三室的房主出租.....");
        houseOwner.constact("李四", "是的!请问你需要租吗?");
        tenant2.constact("李四", "你租好房子了吗?");
        tenant.constact("王五", "还没有呢.");
        
        tenant.constact("九九", "在吗?");
    }
}

测试结果

中介者转发消息, 李四 ====> 张三
房主(张三)收到信息内容:听说你那里有三室的房主出租.....
中介者转发消息, 张三 ====> 李四
租房者(李四)收到信息内容:是的!请问你需要租吗?
中介者转发消息, 王五 ====> 李四
租房者(李四)收到信息内容:你租好房子了吗?
中介者转发消息, 李四 ====> 王五
租房者(王五)收到信息内容:还没有呢.
中介者转发消息, 李四 ====> 九九
中介者转发消息失败,九九不在线
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值