中介者模式
簡介
仔細觀察周邊事物,存在著很多很多的中介者.例如租房、租車、游戲平臺等.可以充當一個平臺的作用,讓不同用戶之間交互更方便.不同個體之間存在著強關聯(lián)關系,很導致很嚴重的問題.例如
1、對象和對象之間的強依賴,會導致系統(tǒng)的復雜性加劇,當一個對象發(fā)生改變的時候,需要跟蹤關聯(lián)對象也修改.
2、對象之間關聯(lián)導致可復用性下降.
3、系統(tǒng)的擴展性降低.
中介者模式,定義了一個中介對象來封裝一系列對象之間的交互關系。中介者使各個對象之間不需要顯式地相互引用,從而使耦合性降低,而且可以獨立地改變它們之間的交互行為。
分析

中介者模式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 {
//中介執(zhí)行方法
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("房子多少錢");
}
}
優(yōu)缺點
優(yōu)點
1、簡化對象之間的關聯(lián)程度.將各個同事類解偶.
2、簡化同事類的設計和實現(xiàn).
缺點
1、中介者的邏輯關系會變得非常復雜.
適用場景
1、系統(tǒng)對象之間存在復雜的引用關系,依賴復雜.
2、中間類封裝多個類的行為.
總結
中轉協(xié)作
中介者對同事類之間的關系進行封裝,同事類在不需要知道其他對象的情況下通過中介者與其他對象完成通信。在這個過程中同事類是不需要指明中介者該如何做,中介者可以根據(jù)自身的邏輯來進行協(xié)調,對同事的請求進一步處理,將同事成員之間的關系行為進行分離和封裝。