设计模式之中介者模式(Mediator Pattern)

    xiaoxiao2023-12-24  29

    What:

    中介者模式使用一个中介对象来封装一系列对象的交互,从而使各对象不需要显式的相互引用,从而使得对象我们耦合松散,而且可以独立地改变对象之间的交互。该模式是用来降低多个对象和类之间的通信复杂性。

    Why:

    优点:

    1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

    缺点:

    1.中介者会庞大,变得复杂难以维护。 2.如果中介者类出现问题,将会导致所有相关类出问题。

    Where:

    多个类相互耦合,形成了网状结构。

    How:

    案例:聊天室有买家和卖家。买家留言,卖家自动回复。

    IUser接口:定义用户的行为

    public interface IUser { void sendMessage(String sendMessage); void receiveMessage(String sendMessage); }

    Seller类:

    public class Seller implements IUser { private ChatRoom chatRoom = new ChatRoom(); @Override public void sendMessage(String message) { try { chatRoom.sendMessage(this,message); } catch (Exception e) { e.printStackTrace(); } } @Override public void receiveMessage(String message) { if(message != null && message != ""){ this.sendMessage("您好!如需帮助,请致电:1234567"); } } }

    Buyer类:

    public class Buyer implements IUser { private ChatRoom chatRoom = new ChatRoom(); @Override public void sendMessage(String message) { try { chatRoom.sendMessage(this,message); } catch (Exception e) { e.printStackTrace(); } } @Override public void receiveMessage(String message) { if(message != "" && message != null){ Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String str = sc.next(); this.sendMessage(str); } } } }

    ChatRoom类:充当中介者角色

    public class ChatRoom { public static IUser buyer = new Buyer(); public static IUser seller = new Seller(); private SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public void sendMessage(IUser user, String message) throws Exception { if (user.getClass().getSimpleName().equals("Buyer")) { System.out.println(date.format(new Date()) + " " + "Buyer: " + message); seller.receiveMessage(message); } else if (user.getClass().getSimpleName().equals("Seller")) { System.out.println(date.format(new Date()) + " " + "Seller: " + message); buyer.receiveMessage(message); } else { throw new Exception(); } } }

    Test类:

    public class Test { public static void main(String[] args) { ChatRoom chatRoom = new ChatRoom(); Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String str = sc.next(); chatRoom.buyer.sendMessage(str); } } }

    输出:使用Scanner类在控制台输入,充当买家向卖家留言,卖家会自动回复。

    请问可以7天无条件退款吗? 2019-04-26 10:59:17 Buyer: 请问可以7天无条件退款吗? 2019-04-26 10:59:17 Seller: 您好!如需帮助,请致电:1234567 Buyer: 这件商品打折吗? 2019-04-26 10:59:22 Buyer: Buyer: 2019-04-26 10:59:22 Seller: 您好!如需帮助,请致电:1234567

    总结

    中介者模式中的中介者类简化了对象之间的引用,还可以进一步控制对象之间的交互。这个模式简化系统的结构,使原本复杂系统转变成简单的星状结构,使对象之间的关系易于理解和维护。但同时不要滥用,因为中介者模式会使中介者的逻辑复杂,变得难以维护,而且万一中介者类出问题将可能导致系统奔溃!

    了解更多设计模式:

    设计模式系列

    最新回复(0)