设计模式之中介者
2019-03-24 本文已影响0人
WilliamIT
中介者模式
简介
仔细观察周边事物,存在着很多很多的中介者.例如租房、租车、游戏平台等.可以充当一个平台的作用,让不同用户之间交互更方便.不同个体之间存在着强关联关系,很导致很严重的问题.例如
1、对象和对象之间的强依赖,会导致系统的复杂性加剧,当一个对象发生改变的时候,需要跟踪关联对象也修改.
2、对象之间关联导致可复用性下降.
3、系统的扩展性降低.
中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。
分析
中介者模式UML.png包含如下角色:
1、Mediator:抽象中介者.用于定义同事对象到中介者对象之间的接口。
2、ConcreteMediator:具体中介者.需要知道所有同事类,以及同事类之间的传递事件.
3、Colleague:抽象同事类.
4、ConcreteColleague具体同事类.
例子
抽象中介者类
/**
* ClassName: Mediator
* Author: william_zhang
* Date: 2019/3/10 10:49 PM
**/
public interface Mediator {
//中介执行方法
void execute(String message, Person person);
}
抽象同事类
/**
* ClassName: Person
* Author: william_zhang
* Date: 2019/3/10 10:50 PM
**/
public abstract class Person {
protected String name;
//中介者
protected Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
public abstract void dealMessage(String message);
}
具体同事类
1、租房的人
/**
* ClassName: RentPerson
* Author: william_zhang
* Date: 2019/3/10 10:56 PM
**/
public class RentPerson extends Person {
public RentPerson(String name, Mediator mediator) {
super(name, mediator);
}
@Override
public void dealMessage(String message) {
System.out.println("RentPerson:" + "收到啦");
}
public void sendMessage(String message) {
System.out.println("RentPerson send:" + message);
mediator.execute(message, this);
}
}
2、出租的人
/**
* ClassName: HousePerson
* Author: william_zhang
* Date: 2019/3/10 10:54 PM
**/
public class HousePerson extends Person {
public HousePerson(String name, Mediator mediator) {
super(name, mediator);
}
@Override
public void dealMessage(String message) {
System.out.println("HousePerson:" + "收到啦");
}
public void sendMessage(String message) {
System.out.println("HousePerson send:" + message);
mediator.execute(message, this);
}
}
具体中介者
/**
* ClassName: ConcreteMediator
* Author: william_zhang
* Date: 2019/3/10 10:53 PM
**/
public class ConcreteMediator implements Mediator {
private HousePerson housePerson;
private RentPerson rentPerson;
public void setHousePerson(HousePerson housePerson) {
this.housePerson = housePerson;
}
public void setRentPerson(RentPerson rentPerson) {
this.rentPerson = rentPerson;
}
/**
* 处理具体逻辑的中介方法
* @param message 消息
* @param person 对应人
*/
@Override
public void execute(String message, Person person) {
if (person instanceof HousePerson) {
rentPerson.dealMessage(message);
}
if (person instanceof RentPerson) {
housePerson.dealMessage(message);
}
}
}
Main方法
/**
* ClassName: Main
* Author: william_zhang
* Date: 2019/3/10 10:57 PM
**/
public class Main {
public static void main(String[] args) {
ConcreteMediator concreteMediator = new ConcreteMediator();
HousePerson housePerson = new HousePerson("william", concreteMediator);
RentPerson rentPerson = new RentPerson("xiaoming", concreteMediator);
concreteMediator.setHousePerson(housePerson);
concreteMediator.setRentPerson(rentPerson);
housePerson.sendMessage("你好啊");
rentPerson.sendMessage("房子多少钱");
}
}
优缺点
优点
1、简化对象之间的关联程度.将各个同事类解偶.
2、简化同事类的设计和实现.
缺点
1、中介者的逻辑关系会变得非常复杂.
适用场景
1、系统对象之间存在复杂的引用关系,依赖复杂.
2、中间类封装多个类的行为.
总结
中转协作
中介者对同事类之间的关系进行封装,同事类在不需要知道其他对象的情况下通过中介者与其他对象完成通信。在这个过程中同事类是不需要指明中介者该如何做,中介者可以根据自身的逻辑来进行协调,对同事的请求进一步处理,将同事成员之间的关系行为进行分离和封装。