中介者模式就是利用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

就像租房的中介系统,房主跟租房者不需要知道彼此只需要,只要在中介系统发布消息。

如此房主跟租房者之间不需要建立复杂关系,他们都只需要跟中介建立关系。

通常在以下情况下考虑使用中介者模式:

(1)系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。

(2)一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。

(3)一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。

(4)想通过一个中间类来封装多各类中的行为,而又不想生成太多的子类,可以通过引入中介者类来实现,在中介者中定义多个对象交互的公共行为,如果改变行为则可以增加新的中介者类。

(5)欲使一个后端数据模型能够被多个前端用户界面连接

抽象中介者:

 public abstract class Meditor {
abstract void Send(String message,Person person);
abstract void SetRenter(Person renter);
abstract void SetLandlord(Person landlord);
}

抽象同事类:

 public abstract class Person {
Meditor m_Meditor;// person 内部需要有一个中介者
abstract void SetMeditor(Meditor meditor);// 为 meditor 初始化
abstract void SendMessage(String message);//发送租房信息
abstract void GetMessage(String message);//获取租房信息
}

具体中介者:

 public class HouseMeditor extends Meditor {
private Person renter,landlord;
@Override
void Send(String message, Person person) {
if (person.equals(renter)) {
landlord.GetMessage(message);
}else {
renter.GetMessage(message);
}
} @Override
void SetRenter(Person renter) {
this.renter = renter;
} @Override
void SetLandlord(Person landlord) {
this.landlord = landlord;
} }

具体同事类:

房主:

 public class Landlord extends Person {

     @Override
void SetMeditor(Meditor meditor) {
m_Meditor = meditor;
} @Override
void SendMessage(String message) {
m_Meditor.Send(message, this);
} @Override
void GetMessage(String message) {
System.out.println("房东收到信息:" + message);
} }

租房者:

 public class Renter extends Person{

     @Override
void GetMessage(String message) {
System.out.println("租房者收到信息:" + message);
} @Override
void SetMeditor(Meditor meditor) {
m_Meditor = meditor;
} @Override
void SendMessage(String message) {
m_Meditor.Send(message, this);
} }

客户测试类:

 public class MeditorPattern {
public static void main(String[] args) { Meditor meditor = new HouseMeditor(); Person renter = new Renter();
Person landlord = new Landlord(); meditor.SetRenter(renter);
meditor.SetLandlord(landlord); renter.SetMeditor(meditor);
landlord.SetMeditor(meditor); renter.SendMessage("我想租套房子!");
landlord.SendMessage("我要出租房子!");
}
}

运行结果:

房东收到信息:我想租套房子!
租房者收到信息:我要出租房子!

最新文章

  1. how2heap分析系列:2_fastbin_dup
  2. Java内存以及GC
  3. Java实验五
  4. 32-bit ALU [Verilog]
  5. [小细节,大BUG]记录一些小问题引起的大BUG(长期更新....)
  6. Java:数组
  7. BeX5平台简明部署过程
  8. 《OD大数据实战》Flume环境搭建
  9. SQL服务器名称更改
  10. Python文件处理之文件打开方式(一)
  11. 虚拟化技术学习(一)在VMware虚拟机中安装KVM
  12. 内存与IO的交换【转】
  13. 响应式用法rem,需要加入这段JS
  14. 剑指Offer 63. 数据流中的中位数(其他)
  15. spring-boot-starter大力出奇迹
  16. SSH免费登录
  17. ios 输入框问题
  18. BitTorrent Sync 基于BT的文件同步
  19. 解决vue项目打包后背景图片找不到的问题
  20. python(59):yield 函数

热门文章

  1. 用C++Builder在Windows开始按钮上绘图制作方法
  2. HTML 项目符号
  3. PAT甲级——A1081 Rational Sum
  4. 左神算法进阶班6_1LFU缓存实现
  5. mysql 根据时间查询 格式转换竟然要注意大小写,天坑
  6. js时间比较大小,时间加减
  7. Luogu P1429 平面最近点对(加强版)(分治)
  8. Windows API 第20篇 SetVolumeMountPoint 设置卷挂载点参数错误
  9. csp-s模拟47 Emotional Flutter,Endless Fantasy题解
  10. JavaScript RegExp 对象的三种方法