重学设计模式(三、设计模式-中介者模式)

1、中介者模式

    对于中介,大家平时听得最多的莫过于房产中介,房产中介的职责很简单,就是在买房和卖房之间建立一种桥梁沟通两者,这就是我们今天要学习的中介者模式。

1.1、什么是中介者模式

  • 定义

    中介者模式又叫调停模式,是一种行为设计模式,中介者使各个对象不需要显示的相互引用,而是通过一个特殊的中介者对象使程序组件间接通信,从而减少程序组件之间的耦合,它是迪米特法则的典型应用。

    该模式限制了对象之间的直接通信,并迫使它们仅通过中介对象进行协作,类似于MVC模式中的 Controller 部分,控制器(C)就是模型(M)和视图(V)的中介者。

中介者模式的结构:

    1)抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

    2)具体中介者(Concrete Mediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。

    3)抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

    4)具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

    中介者模式的意图在于:减少对象之间的混乱关系(大量多对多的关系)时,通过中介者统一管理这些对象,将对象之间的交互封装在中介者的对象中,从而减少对象间的耦合。

1.2、中介者模式的优缺点

  • 优点

    1)符合单一职责原则,将各组件之间的通信提取到一个地方,减少了各组件间的耦合,使其更易于理解和维护;

    2)符合开闭原则,当引入新的中介者,无须更改原有组件。

  • 缺点

    中介者将原本多个对象间的相互依赖变成了中介者和多个同事间的依赖关系,当同事类越来越多时,中介者本身就会变得复杂而臃肿。

1.3、创建方式

    以小明通过中介来租房子为例。

1)抽象中介者(Mediator)角色

//抽象中介者
public interface Mediator {

	void register(String name,HouseOwner owner); //注册同事对象,房主在中介登记了信息
	
	void forwardMessage(HouseOwner owner,int price); //转发同事信息,与同事对象交互信息的方法
}

2)具体中介者(Concrete Mediator)角色

//具体中介者
public class ConcreteMediator implements Mediator{

	//管理同事对象
	private HashMap<String,HouseOwner> houseowner = new HashMap<String, HouseOwner>();
	
	@Override
	public void register(String name, HouseOwner owner) {
		houseowner.put(name, owner);
	}
	
	@Override
	public void forwardMessage(HouseOwner owner,int price) { 
		if(owner.sendMessage(price)){
			System.out.println("成功租出");
		}else{
			System.out.println("还是看看其他的吧");
		}
	}

}

3)抽象同事类(Colleague)角色

//抽象同事类
public abstract class HouseOwner {

	private Mediator mediator; //聚合,中介者
	
	public HouseOwner(Mediator mediator){
		this.mediator = mediator;
	}

	public Mediator getMediator() {
		return mediator;
	}
	
	public abstract boolean sendMessage(int price);
}

4)具体同事类(Concrete Colleague)角色

//具体同事类,也就是具体的房主A
public class HouseAColleague extends HouseOwner{

	public HouseAColleague(Mediator mediator) {
		super(mediator);
		this.getMediator().register("HouseA", this);
	}

	@Override
	public boolean sendMessage(int price) {
		if(price>=900){
			return true;
		}
		System.out.println("我的房子最少租900块");
		return false;
	}

}

//具体同事类,也就是具体的房主B
public class HouseBColleague extends HouseOwner{

	public HouseBColleague(Mediator mediator) {
		super(mediator);
		this.getMediator().register("HouseB", this);
	}

	@Override
	public boolean sendMessage(int price) {
		if(price>=1500){
			return true;
		}
		System.out.println("我的房子最少租1500块");
		return false;
	}

}

 5)客户端

public class Client {

	public static void main(String[] args) {
		//创建中介者
		Mediator mediator = new ConcreteMediator();
		
		//中介带顾客看房子A
		HouseOwner houseA = new HouseAColleague(mediator);
		//房东说
		houseA.sendMessage(900);
		//顾客A只愿意出800
		mediator.forwardMessage(houseA,800);
		
		
		//中介带顾客看房子B
		HouseOwner houseB = new HouseBColleague(mediator);
		//房东说
		houseB.sendMessage(1500);
		//顾客A愿意1500租
		mediator.forwardMessage(houseB,1500);
		
	}
}

案例效果:

此时的UML图:

    客户通过中介租房子,中介跟具体的房东打交道。

1.4、总结及建议

    中介者模式的主要目的就是消除一组系统组件之间的相互依赖关系,而变成依赖于单个中介对象,它集中了系统组件之间的通信,组件只知道中介对象,而很难直接与真正的组件(房东)通信。

应用场景:

    1)许多对象以复杂的方式交互时的依赖关系使得系统难以理解和维护时,可以使用中介者模式;

    2)一个对象引用其他很多对象,导致难以复用该对象时,可以使用中介者模式。

JDK中中介者模式的应用:

    java.util.Timer

    java.util.concurrent.Executor#execute()

    java.lang.reflect.Method#invoke()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穆瑾轩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值