【Java23种设计模式之中介者模式——租房子案例】

中介者模式(Mediator Pattern):

是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

【Java23种设计模式之中介者模式——租房子案例】_第1张图片

使用之后的模式:

【Java23种设计模式之中介者模式——租房子案例】_第2张图片

 

 

中介者模式包含以下主要角色:

抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

租房子案例:

【Java23种设计模式之中介者模式——租房子案例】_第3张图片

 

Mediator是抽象中介者,定义了同事对象列表中介者对象的接口;

package com.zhongjiezhe3;

//它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法

public abstract class Mediator {

	    //定义抽象中介的抽象方法

		public abstract void contact(String message,Person person);
}

ConcreteJg是具体中介者对象,实现抽象类的方法,它需要知道所有的具体同事类,并且从具体同事类接受消息,向具体同事类发出命令;

package com.zhongjiezhe3;

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

public class MediatorJg extends Mediator{
	//中介机构只知道租客和房东
	private HouseOwner houseowner;
	private Tenant tenant;
	
	public MediatorJg() {
		super();
	}
	public MediatorJg(HouseOwner houseowner, Tenant tenant) {
		super();
		this.houseowner = houseowner;
		this.tenant = tenant;
	}
	//get/set方法
	public HouseOwner getHouseowner() {
		return houseowner;
	}
	public void setHouseowner(HouseOwner houseowner) {
		this.houseowner = houseowner;
	}
	public Tenant getTenant() {
		return tenant;
	}
	public void setTenant(Tenant tenant) {
		this.tenant = tenant;
	}
	//重写继承抽象中介者类方法
	@Override
	public void contact(String message, Person person) {
		if(person==houseowner) {
			this.houseowner.getMessage(message);
		}else {
			this.tenant.getMessage(message);
		}
	}
}

Person叫做抽象同事类;

package com.zhongjiezhe3;

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

public abstract class Person {
	
		protected String name;
		protected Mediator mediator;
		
		public Person(String name, Mediator mediator) {
			super();
			this.name = name;
			this.mediator = mediator;
		}	
}

HouseOwner是具体同事类,每个具体的同事只知道自己的行为,而不了解其他同事类的情况,但是它们却都认识中介者对象;

package com.zhongjiezhe3;

public class HouseOwner extends Person {
	//全参构造方法
	public HouseOwner(String name, Mediator mediator) {
		super(name, mediator);
	}
	//房东与中介者联系的方法
	public void contact(String message) {
		this.mediator.contact(message,this);
	}
	//房东获取信息的方法
	public void getMessage(String message) {
		System.out.println(this.name+"获得信息:"+message);
	}
}

Tenant是具体同事类,每个具体的同事只知道自己的行为,而不了解其他同事类的情况,但是它们却都认识中介者对象;

package com.zhongjiezhe3;

public class Tenant extends Person {
    //全参构造方法
	public Tenant(String name, Mediator mediator) {
		super(name, mediator);
	}
	//租客与中介者联系的方法
	public void contact(String message) {
		this.mediator.contact(message,this);
	}
	//租客获取信息的方法
	public void getMessage(String message) {
		System.out.println(this.name+"获得消息:"+message);
	}
}

客户端测试类

package com.zhongjiezhe3;

public class Test {
	public static void main(String[] args) {
		//创建中介者对象
		MediatorJg mediator =new MediatorJg();		
		//创建房东对象,房东只需要知道中介
		HouseOwner houseowner=new HouseOwner("小李",mediator);
		//创建租客对象,租客也只需要知道中介
		Tenant tenant =new Tenant("老王",mediator);
		//中介需要知道房主和租客
        mediator.setTenant(tenant);
        mediator.setHouseowner(houseowner);
        //承租者与中介联系
        tenant.contact("我需要租三室一厅的房子");
        //房主与中介联系
        houseowner.contact("我这里有三室一厅的房子,你要租吗?");


	}
}

运行结果

【Java23种设计模式之中介者模式——租房子案例】_第4张图片

应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

缺点:中介者会庞大,变得复杂难以维护。

使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项:不应当在职责混乱的时候使用。

你可能感兴趣的:(设计模式,中介者模式)