设计模式之中介者模式
1.中介者模式概念
定义了一个对象来封装一系列其他对象之间的交互,从而降低这些对象间的耦合度。这种模式使得各个对象不需要显式地相互引用,而是通过一个中介者对象来进行通信。
2.中介者模式组成
1)抽象中介者(Mediator)
抽象中介者是一个接口或抽象类,定义了中介者的基本行为。如注册,接受消息,转发消息
2)具体中介者(Concrete Mediator)
具体中介者实现了抽象中介者接口中的方法,协调各个同事对象之间的交互。
3)抽象同事类(Colleague)
抽象同事类是一个接口或抽象类,定义了同事对象的基本行为。如发送消息,接受消息
4)具体同事类(ConcreteColleague)
具体同事类实现了抽象同事类中的方法,负责具体的业务逻辑。
3.举个栗子
小久和惜己在外地一起工作,正好自己的朋友惜己要回到自己家乡办事,然后拜托惜己给父母捎点这里的土特产,父母收到土特产。
如下图
父母收到小久的土特产很高兴,拜托惜己给小久带了妈妈的毛衣,惜己办完事回去,小久收到妈妈亲手制作的毛衣。
4.代码实现
1)同事抽象类
package org.xiji.mediator;
/**
* 同事抽象类
*/
public interface Colleague {
/**
* 发送消息
*/
void send(String msg, SendAndReceiveContain sendAndReceiveContain);
/**
* 接受消息
*/
void receive(String msg, SendAndReceiveContain sendAndReceiveContain);
}
2)中介抽象类
package org.xiji.mediator;
/**
* 中介者接口
*/
public interface Mediator {
/**
* 注册
*/
void register(User user);
/**
* 转发消息
*/
void sendMessage(String msg, SendAndReceiveContain sendAndReceiveContain);
}
3)接受发送容器类
package org.xiji.mediator;
/**
* 接受者,发送者容器
*/
public class SendAndReceiveContain {
/**
* 接收者
*/
public User receiver;
/**
*
* 发送者
*/
public User send;
public SendAndReceiveContain(User receiver, User send) {
this.receiver = receiver;
this.send = send;
}
}
4)同事抽象实现类
package org.xiji.mediator;
public class User implements Colleague{
String name;
/**
* 中介者
*/
Mediator mediator;
public User(Mediator mediator,String name)
{
this.mediator = mediator;
this.name =name;
mediator.register(this);
}
//注册信息
/**
* 发送消息
*/
@Override
public void send(String msg, SendAndReceiveContain sendAndReceiveContain) {
System.out.println(this.name+"发送消息:" +msg+"to"+sendAndReceiveContain.receiver.name);
mediator.sendMessage(msg,sendAndReceiveContain);
}
/**
* 接受消息
*/
@Override
public void receive(String msg, SendAndReceiveContain sendAndReceiveContain) {
System.out.println(this.name+"收到消息:" +msg+"\n发送者:"+sendAndReceiveContain.send.name);
}
}
5)中介抽象实现类
package org.xiji.mediator;
import java.util.ArrayList;
import java.util.List;
public class MediatorImpl implements Mediator{
/**
* 定义集合,用于存储所有的同事对象
*/
List<User> users = new ArrayList<>();
/**
*添加用户
*/
@Override
public void register(User user) {
users.add(user);
}
/**
* 转发信息
*/
@Override
public void sendMessage(String msg, SendAndReceiveContain sendAndReceiveContain) {
for (User user : users) {
if (user.name.equals(sendAndReceiveContain.receiver.name)) {
//转发信息
System.out.println("惜己"+"把"+sendAndReceiveContain.send.name+msg+"带给"+sendAndReceiveContain.receiver.name);
user.receive(msg,sendAndReceiveContain);
}
}
}
}
6)测试代码实现类
package org.xiji.mediator;
import java.util.Scanner;
/**
* 中介者模式测试类
*/
public class MediatorMain {
public static void main(String[] args) {
//中介者
Mediator 惜己 = new MediatorImpl();
//容器
User 小久 = new User(惜己,"小久");
//小久父母
User 父母 = new User(惜己,"小久父母");
//小久===》父母
SendAndReceiveContain sendAndReceiveContain = new SendAndReceiveContain(父母, 小久);
//父母===》小久
SendAndReceiveContain sendAndReceiveContain1 = new SendAndReceiveContain(小久, 父母);
Scanner scanner = new Scanner(System.in);
System.out.println("=====================================");
while (true) {
System.out.println("发送东西");
String msg = scanner.next();
小久.send(msg,sendAndReceiveContain);
System.out.println("=====================================");
System.out.println("父母让惜己帮自己给小久带点东西");
String msg2 = scanner.next();
父母.send(msg2,sendAndReceiveContain1);
}
}
}
7)运行结果
小久==>土特产==>惜己==>小久父母+土特产
父母==》妈妈的毛衣===》惜己===》小久+妈妈的毛衣