中介者模式(Mediator、ConcreteMediator、Colleague Class)(租房中介)
中介者模式就是利用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
就像租房的中介系统,房主跟租房者不需要知道彼此只需要,只要在中介系统发布消息。
如此房主跟租房者之间不需要建立复杂关系,他们都只需要跟中介建立关系。
通常在以下情况下考虑使用中介者模式:
(1)系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
(2)一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
(3)一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
(4)想通过一个中间类来封装多各类中的行为,而又不想生成太多的子类,可以通过引入中介者类来实现,在中介者中定义多个对象交互的公共行为,如果改变行为则可以增加新的中介者类。
(5)欲使一个后端数据模型能够被多个前端用户界面连接
抽象中介者:
1 public abstract class Meditor { 2 abstract void Send(String message,Person person); 3 abstract void SetRenter(Person renter); 4 abstract void SetLandlord(Person landlord); 5 }
抽象同事类:
1 public abstract class Person { 2 Meditor m_Meditor;// person 内部需要有一个中介者 3 abstract void SetMeditor(Meditor meditor);// 为 meditor 初始化 4 abstract void SendMessage(String message);//发送租房信息 5 abstract void GetMessage(String message);//获取租房信息 6 }
具体中介者:
1 public class HouseMeditor extends Meditor { 2 private Person renter,landlord; 3 @Override 4 void Send(String message, Person person) { 5 if (person.equals(renter)) { 6 landlord.GetMessage(message); 7 }else { 8 renter.GetMessage(message); 9 } 10 } 11 12 @Override 13 void SetRenter(Person renter) { 14 this.renter = renter; 15 } 16 17 @Override 18 void SetLandlord(Person landlord) { 19 this.landlord = landlord; 20 } 21 22 }
具体同事类:
房主:
1 public class Landlord extends Person { 2 3 @Override 4 void SetMeditor(Meditor meditor) { 5 m_Meditor = meditor; 6 } 7 8 @Override 9 void SendMessage(String message) { 10 m_Meditor.Send(message, this); 11 } 12 13 @Override 14 void GetMessage(String message) { 15 System.out.println("房东收到信息:" + message); 16 } 17 18 }
租房者:
1 public class Renter extends Person{ 2 3 @Override 4 void GetMessage(String message) { 5 System.out.println("租房者收到信息:" + message); 6 } 7 8 @Override 9 void SetMeditor(Meditor meditor) { 10 m_Meditor = meditor; 11 } 12 13 @Override 14 void SendMessage(String message) { 15 m_Meditor.Send(message, this); 16 } 17 18 }
客户测试类:
1 public class MeditorPattern { 2 public static void main(String[] args) { 3 4 Meditor meditor = new HouseMeditor(); 5 6 Person renter = new Renter(); 7 Person landlord = new Landlord(); 8 9 meditor.SetRenter(renter); 10 meditor.SetLandlord(landlord); 11 12 renter.SetMeditor(meditor); 13 landlord.SetMeditor(meditor); 14 15 renter.SendMessage("我想租套房子!"); 16 landlord.SendMessage("我要出租房子!"); 17 } 18 }
运行结果:
房东收到信息:我想租套房子!
租房者收到信息:我要出租房子!