中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显式的互相引用,从而使其松耦合,而且可以独立地改变它们之间的交互
中介者模式很好的体现了迪米特法则
,如果两个类不必彼此直接通信,那个这两个类就不应当发生直接的相互作用,如果一个类要调用另一个类的某个方法,可以通过第三者来转发这个调用。
通过中介者对象,可以将相互调用的类之间的网状结构,变成以中介者为中心的星型结构,每个具体对象通过中介者与其他对象发生相互作用
中介者模式角色:
/**
* 中介者
*/
public interface Mediator {
/**
* 发送消息给具体同事
*/
void sendMessage(String message, Colleague colleague);
}
/**
* 同事类
*/
public interface Colleague {
/**
* 发送消息
*/
void send(String message, Mediator mediator);
/**
* 接收中介者的消息
*/
void notify(String message);
}
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* 具体中介者
*/
@Service
public class ConcreteMediator implements Mediator {
/**
* 管理具体的同事类
*/
@Resource
List<Colleague> colleagueList = new ArrayList<>();
@Override
public void sendMessage(String message, Colleague colleague) {
for (Colleague col : colleagueList) {
if (col == colleague) {
// 对于自身的消息可以做其它逻辑处理
// doSomething...
continue;
}
// 其它参与者通知
col.notify(message);
}
}
}
import org.springframework.stereotype.Service;
/**
* 具体同事 A
*/
@Service("colleagueA")
public class ConcreteColleagueA implements Colleague {
public void send(String message, Mediator mediator) {
mediator.sendMessage(message, this);
}
public void notify(String message) {
System.out.println("ConcreteColleagueA 得到消息 " + message);
}
}
/**
* 具体同事 B
*/
@Service("colleagueB")
public class ConcreteColleagueB implements Colleague {
public void send(String message, Mediator mediator) {
mediator.sendMessage(message, this);
}
public void notify(String message) {
System.out.println("ConcreteColleagueB 得到消息 " + message);
}
}
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ApplicationTest {
@Resource(name = "colleagueA")
private Colleague concreteColleagueA;
@Resource(name = "colleagueB")
private Colleague concreteColleagueB;
@Resource
private Mediator mediator;
@Test
public void test() {
// 具体同事 A 发送消息
mediator.sendMessage("明天吃什么?", concreteColleagueA);
// result:ConcreteColleagueB 得到消息 明天吃什么?
// 具体同事 B 发送消息
mediator.sendMessage("明天吃面吧。", concreteColleagueB);
// result:ConcreteColleagueA 得到消息 明天吃面吧。
}
}