中介者模式属于行为型模式
中介者模式用一个中介对象封装一系列的交互,
对象间通信不需要显式地相互引用,使其耦合松散。
如果对象之间的关系呈现出网状结构,
对象之间存在大量多对多关系,关系极其复杂,
这些对象被称为同事对象。
包含抽象中介、具体中介者、抽象同事、具体同事四种角色。
抽象中介者
Mediator
package com.example.duohoob.dp.mediator;
/**
* 抽象中介者
* @Title: Mediator.java
* @Package com.example.duohoob.dp.mediator
*
* @author yangwei
* @date 2022年7月15日
*/
public interface Mediator {
/**
* 同事类注册
* @author yangwei
* @date 2022年7月15日
*
* @param colleague
*/
void register(Colleague colleague);
/**
* 与同事通信
* @author yangwei
* @date 2022年7月15日
*
* @param colleague
*/
void communicate(Colleague colleague);
}
抽象同事
Colleague
package com.example.duohoob.dp.mediator;
/**
* 抽象同事
* @Title: Colleague.java
* @Package com.example.duohoob.dp.mediator
*
* @author yangwei
* @date 2022年7月15日
*/
public abstract class Colleague {
/**
* 持有对中介者的引用
*/
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
/**
* 发送
* @author yangwei
* @date 2022年7月15日
*
*/
public abstract void sendSth();
/**
* 接收
* @author yangwei
* @date 2022年7月15日
*
*/
public abstract void receiveSth();
}
具体同事
ColleagueX 具体同事-x
package com.example.duohoob.dp.mediator;
/**
* 具体同事-x
* @Title: ColleagueX.java
* @Package com.example.duohoob.dp.mediator
*
* @author yangwei
* @date 2022年7月15日
*/
public class ColleagueX extends Colleague {
public ColleagueX(Mediator mediator) {
super(mediator);
}
@Override
public void sendSth() {
// TODO Auto-generated method stub
System.out.println("hello,我是x,我发出消息");
// 通过中介者通信
mediator.communicate(this);
}
@Override
public void receiveSth() {
// TODO Auto-generated method stub
System.out.println("hello,我是x,我收到消息");
}
}
ColleagueY 具体同事-y
package com.example.duohoob.dp.mediator;
/**
* 具体同事-y
* @Title: ColleagueY.java
* @Package com.example.duohoob.dp.mediator
*
* @author yangwei
* @date 2022年7月15日
*/
public class ColleagueY extends Colleague {
public ColleagueY(Mediator mediator) {
super(mediator);
}
@Override
public void sendSth() {
// TODO Auto-generated method stub
System.out.println("hello,我是y,我发出消息");
// 通过中介者通信
mediator.communicate(this);
}
@Override
public void receiveSth() {
// TODO Auto-generated method stub
System.out.println("hello,我是y,我收到消息");
}
}
具体中介者
ConcreteMediator
package com.example.duohoob.dp.mediator;
import java.util.ArrayList;
import java.util.List;
/**
* 具体中介者
* @Title: ConcreteMediator.java
* @Package com.example.duohoob.dp.mediator
*
* @author yangwei
* @date 2022年7月15日
*/
public class ConcreteMediator implements Mediator {
/**
* 各个同事对象
*/
private List<Colleague> colleagues = new ArrayList<Colleague>();
/**
* 同事类注册到中介者
* @author yangwei
* @date 2022年7月15日
*
* @param colleague
*/
@Override
public void register(Colleague colleague) {
// TODO Auto-generated method stub
if (!colleagues.contains(colleague)) {
colleagues.add(colleague);
}
}
@Override
public void communicate(Colleague colleague) {
// TODO Auto-generated method stub
// 和其它同事通信,除了自己
for (Colleague anotherColleague : colleagues) {
if (colleague == anotherColleague) {
continue;
}
anotherColleague.receiveSth();
}
}
}
测试
package com.example.duohoob.dp.mediator;
/**
* @Title: MediatorTest.java
* @Package com.example.duohoob.dp.mediator
*
* @author yangwei
* @date 2022年7月15日
*/
public class MediatorTest {
public static void main(String[] args) {
// 中介者
ConcreteMediator mediator = new ConcreteMediator();
// 同事x、y
Colleague x = new ColleagueX(mediator);
Colleague y = new ColleagueY(mediator);
// 注册
mediator.register(x);
mediator.register(y);
// x发送消息,看y是否收到,x、y不需要直接交互
x.sendSth();
}
}
运行