中介者模式定义一个中介对象来封装其他对象之间的交互,使原有交互对象之间耦合松散。例如房租中介。
设计模式,一定要敲代码理解
中介者抽象
/**
* @author ggbond
* @date 2024年04月14日 16:52
*/
public abstract class Mediator {
//
abstract void info(Person p1);
abstract void add(Person p1);
}
中介者实现
/**
* @author ggbond
* @date 2024年04月14日 17:00
*/
public class HouseMediator extends Mediator{
private List<Person> list=new ArrayList<>();
@Override
void add(Person p1) {
if (!list.contains(p1)){
list.add(p1);
}
}
@Override
public void info(Person p1) {
for ( Person item :list){
if (!p1.equals(item)){
item.receive();
}
}
}
}
同事实体抽象
/**
* @author ggbond
* @date 2024年04月14日 16:55
*/
public abstract class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void send();
public abstract void receive();
}
同事实体实现
public class Person01 extends Person{
private Mediator mediator;
public Person01(String name,Mediator mediator) {
super(name);
this.mediator=mediator;
}
@Override
public void send() {
System.out.println(this.getName()+"发布出租信息");
this.mediator.info(this);//中介转发
}
@Override
public void receive() {
System.out.println(this.getName()+"收到其他人发布的出租信息");
}
}
/**
* @author ggbond
* @date 2024年04月14日 16:56
*/
public class Person02 extends Person{
private Mediator mediator;
public Person02(String name, Mediator mediator) {
super(name);
this.mediator=mediator;
}
@Override
public void send() {
System.out.println(this.getName()+"发布出租信息");
this.mediator.info(this);//中介转发
}
@Override
public void receive() {
System.out.println(this.getName()+"收到其他人发布的出租信息");
}
}
测试与结果
/**
* @author ggbond
* @date 2024年04月14日 17:09
*/
public class Main {
public static void main(String[] args) {
//中介信息
Mediator mediator=new HouseMediator();
//组件同事对象
Person p1=new Person01("ggbond1",mediator);
Person p2=new Person01("ggbond2",mediator);
mediator.add(p1);
mediator.add(p2);
p1.send();
System.out.println("===========");
p2.receive();
}
}
ggbond1发布出租信息
ggbond2收到其他人发布的出租信息
===========
ggbond2发布出租信息
ggbond1收到其他人发布的出租信息
总结
中介模式声明中介者接口并描述中介者和各种交互同事对象之间所需的交流接口。 在绝大多数情况下, 一个接收同事通知的方法就足够了。满足单一职责原则,开闭原则,无需修改实际同事对象就能增加新的中介者。