中介者模式具体实现

中介者模式实现步骤

  1. 理清各个业务类对象之间的关系,判断是不是复杂的两两依赖关系,把他们当作顾客类。
  2. 定义中介者类,在里面将顾客的信息维护注册,并且顾客在注册的时候,也将中介者信息维护。里面会定义一些方法,用来处理顾客之间的信息交互(方法调用逻辑)。
  3. 定义顾客类,里面用来接收中介发过来的信息具体处理逻辑。

案例

我们以房屋中介为例子,来建立我们的案例。我们先要建立 net.haicoder.mediator 包,然后建立一个抽象的中介者类 Medium.java ,然后创建具体的中介者类 HaicoderMedium.java 建立抽象的客户类 Customer.java 和具体的客户类 Buyer.java Seller.java 和测试类 TestMain.java。文件创建完毕,目录结构如下图:

11 中介者模式代码结构图.png

Medium.java 代码如下:

package net.haicoder.mediator; /** * 嗨客房地产中介 */ public interface Medium { /** * 客户注册 * * @param customer */ void registerCustomer(Customer customer); /** * 发放消息 * * @param message */ void displayMessage(String from, String message); }

HaicoderMedium.java 代码如下:

package net.haicoder.mediator; import java.util.ArrayList; import java.util.List; public class HaicoderMedium implements Medium { List<Customer> customerList = new ArrayList<>(); @Override public void registerCustomer(Customer customer) { if (!customerList.contains(customer)) { customerList.add(customer); customer.setMedium(this); //顾客将当前的中介信息保存 } } /** * 中介者将信息发布,过滤掉发布消息的本人 * * @param from * @param message */ @Override public void displayMessage(String from, String message) { customerList.forEach(tmpCustomer -> { if (!from.equals(tmpCustomer.getName())) { tmpCustomer.receiveMessage(from, message); } }); } }

Customer.java 代码如下:

package net.haicoder.mediator; /** * 客户 */ public abstract class Customer { /** * 保存相应的中介信息 */ protected Medium medium; /** * 当前消费者名称 */ protected String name; /** * 发布消息,买房发布信息,不会直接通知其它人,而是只管往该中介中发布 */ abstract void sentMessage(String message); /** * 接收消息 */ abstract void receiveMessage(String from, String message); public Medium getMedium() { return medium; } public void setMedium(Medium medium) { this.medium = medium; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

Seller.java 代码如下:

package net.haicoder.mediator; /** * 买方 */ public class Seller extends Customer { public Seller(String name) { this.name = name; } /** * @param message */ @Override void sentMessage(String message) { medium.displayMessage(name, message); } @Override void receiveMessage(String from, String message) { System.out.println("卖房者收到 " + from + "发布消息 : " + message); } }

TestMain.java 代码如下:

package net.haicoder.mediator; public class TestMain { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); Medium medium = new HaicoderMedium(); Customer buyer = new Buyer("买房者"); Customer seller = new Seller("卖房者"); medium.registerCustomer(buyer); medium.registerCustomer(seller); buyer.sentMessage("好想买一套房子啊"); seller.sentMessage("好想卖一套房子啊"); } }

代码运行结果如下图:

12 中介者模式代码运行结果图.png

中介者模式总结

一般的对象之间的简单的关系,并且合理的时候是不需要使用中介者模式的,对于那些对象关系比较复杂的才会建议考虑使用设计模式中的中介者模式,将网状的关系变成星状结构,使得对象之间的关系变得清晰。