设计模式之中介者模式笔记
- 说明
- Mediator(中介者)
- 目录
- 中介者模式示例类图
- 抽象中介者类
- 抽象同事类
- 租房者类
- 房主类
- 具体的中介者角色类
- 测试类
说明
记录下学习设计模式-中介者模式的写法。JDK使用版本为1.8版本。
Mediator(中介者)
意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
结构:
其中:
- Mediator(中介者)定义一个接口用于各同事(Colleague)对象通信。
- ConcreteMediator(具体中介者)通过协调各同事对象实现协作行为;了解并维护它的各个同事。
- ConcreteSubject(具体目标)将有关状态存入各ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知。
- Colleague class(同事类)知道它的中介者对象;每一个同事类对象在需要与其他同事通信的时候与它的中介者通信。
适用性:
- 一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
目录
中介者模式示例类图
以该UML类图实现中介者模式示例。
抽象中介者类
package com.example.deesign_patterns.mediator;
//抽象中介者类
public abstract class Mediator {
//联系方法
public abstract void contact(String message,Person person);
}
抽象同事类
package com.example.deesign_patterns.mediator;
//抽象同事类
public abstract class Person {
protected String name;
protected Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
租房者类
package com.example.deesign_patterns.mediator;
//租房者类,具体的同事角色类
public class Tenant extends Person{
public Tenant(String name, Mediator mediator) {
super(name, mediator);
}
//和中介联系(沟通)的方法
public void contact(String message){
mediator.contact(message,this);
}
//获取信息的方法
public void getMessage(String message){
System.out.println("租房者"+name+"获取到的信息是:"+message);
}
}
房主类
package com.example.deesign_patterns.mediator;
//房主类,具体的同事角色类
public class HouseOwner extends Person{
public HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
//和中介联系(沟通)的方法
public void contact(String message){
mediator.contact(message,this);
}
//获取信息的方法
public void getMessage(String message){
System.out.println("房主"+name+"获取到的信息是:"+message);
}
}
具体的中介者角色类
package com.example.deesign_patterns.mediator;
//具体的中介者角色类
public class MediatorStructure extends Mediator{
//聚合租房者和房主对象
private Tenant tenant;
private HouseOwner houseOwner;
public Tenant getTenant() {
return tenant;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
public HouseOwner getHouseOwner() {
return houseOwner;
}
public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
@Override
public void contact(String message, Person person) {
if(person==houseOwner){
tenant.getMessage(message);
}else {
houseOwner.getMessage(message);
}
}
}
测试类
package com.example.deesign_patterns.mediator;
//测试类
public class Client {
public static void main(String[] args) {
//创建中介者对象
MediatorStructure mediator=new MediatorStructure();
//创建租房者对象
Tenant tenant=new Tenant("李四",mediator);
//创建房主对象
HouseOwner houseOwner=new HouseOwner("张三",mediator);
//中介者要知道具体的房主和租房者
mediator.setTenant(tenant);
mediator.setHouseOwner(houseOwner);
tenant.contact("我要租三室的房子!!!");
houseOwner.contact("我这里有三室的房子,你要租吗?");
}
}
好处:
- 松散耦合。中介者模式通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样“牵一处而动全身”了。
- 集中控制交互。多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了,当然如果是已经做好的系统,那么就扩展中介者对象,而各个同事类不需要做修改。
- 一对多关联转变为一对一的关联。没有使用中介者模式的时候,同事对象之间的关系通常是一对多的,引入中介者对象以后,中介者对象和同事对象的关系通常变成双向的一对一,这会让对象的关系更容易理解和实现。
缺点:
- 当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。