当前位置: 首页 > news >正文

二十一、行为型(中介者模式)

中介者模式(Mediator Pattern)

概念
中介者模式是一种行为型设计模式,通过引入一个中介者对象,来减少多个对象之间的直接交互。中介者将对象之间的交互封装在一个统一的接口中,从而降低对象之间的耦合度,增强系统的可维护性和可扩展性。


应用场景

  1. 复杂的对象交互:当系统中存在多个对象并且它们之间有复杂的相互交互时,中介者模式可以帮助简化对象之间的通信。

  2. 解耦对象:当需要减少对象之间的耦合,避免直接引用时,中介者模式提供了一种良好的解耦方案。

  3. 系统扩展:当需要对系统进行扩展时,添加新的对象或功能可以通过中介者进行,而无需修改其他对象的代码。

  4. 聊天系统:在一个聊天应用中,用户通过一个中介者(如聊天服务器)进行消息的发送和接收,从而避免了用户之间的直接交互。


注意点

  1. 中介者复杂性:如果中介者承担了过多的责任,可能导致中介者本身变得复杂,从而影响系统的可维护性。

  2. 性能问题:中介者可能会引入额外的性能开销,尤其是在处理大量消息时,需要合理设计中介者的实现。

  3. 中介者的角色:中介者模式适用于对象之间存在复杂交互的情况,而在简单交互的场景中,使用中介者可能显得多余。


核心要素

  1. Mediator(中介者接口):定义与各个同事对象的交互接口。

  2. ConcreteMediator(具体中介者):实现中介者接口,协调同事对象之间的交互。

  3. Colleague(同事接口):定义同事对象的接口,通过中介者进行交互。

  4. ConcreteColleague(具体同事):实现同事接口,具体的同事对象,使用中介者与其他同事进行交互。


Java代码完整示例

示例:简单的中介者模式实现

// 中介者接口
interface Mediator {void register(Colleague colleague);void send(String message, Colleague sender);
}// 具体中介者
class ConcreteMediator implements Mediator {private List<Colleague> colleagues = new ArrayList<>();@Overridepublic void register(Colleague colleague) {colleagues.add(colleague);}@Overridepublic void send(String message, Colleague sender) {for (Colleague colleague : colleagues) {// 不发送给发送者if (colleague != sender) {colleague.receive(message);}}}
}// 同事接口
abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public abstract void receive(String message);
}// 具体同事A
class ConcreteColleagueA extends Colleague {public ConcreteColleagueA(Mediator mediator) {super(mediator);}@Overridepublic void receive(String message) {System.out.println("ConcreteColleagueA received: " + message);}public void send(String message) {System.out.println("ConcreteColleagueA sending: " + message);mediator.send(message, this);}
}// 具体同事B
class ConcreteColleagueB extends Colleague {public ConcreteColleagueB(Mediator mediator) {super(mediator);}@Overridepublic void receive(String message) {System.out.println("ConcreteColleagueB received: " + message);}public void send(String message) {System.out.println("ConcreteColleagueB sending: " + message);mediator.send(message, this);}
}// 客户端代码
public class MediatorPatternDemo {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);mediator.register(colleagueA);mediator.register(colleagueB);colleagueA.send("Hello, B!");colleagueB.send("Hi, A!");}
}

输出结果

ConcreteColleagueA sending: Hello, B!
ConcreteColleagueB received: Hello, B!
ConcreteColleagueB sending: Hi, A!
ConcreteColleagueA received: Hi, A!

各种变形用法完整示例

  1. 多个同事类型的交互

    通过扩展同事对象的类型,允许更多的对象参与到中介者的交互中。

    代码示例:多个同事类型

    // 具体同事C
    class ConcreteColleagueC extends Colleague {public ConcreteColleagueC(Mediator mediator) {super(mediator);}@Overridepublic void receive(String message) {System.out.println("ConcreteColleagueC received: " + message);}public void send(String message) {System.out.println("ConcreteColleagueC sending: " + message);mediator.send(message, this);}
    }public class MultiColleagueDemo {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);ConcreteColleagueC colleagueC = new ConcreteColleagueC(mediator);mediator.register(colleagueA);mediator.register(colleagueB);mediator.register(colleagueC);colleagueA.send("Hello, B and C!");colleagueC.send("Hi, A and B!");}
    }
    
  2. 中介者与同事的复杂交互

    中介者可以实现更复杂的业务逻辑,如对消息进行过滤或修改。

    代码示例:复杂交互

    class EnhancedMediator implements Mediator {private List<Colleague> colleagues = new ArrayList<>();@Overridepublic void register(Colleague colleague) {colleagues.add(colleague);}@Overridepublic void send(String message, Colleague sender) {// 简单的消息过滤if (!message.contains("spam")) {for (Colleague colleague : colleagues) {if (colleague != sender) {colleague.receive(message);}}} else {System.out.println("Message blocked: " + message);}}
    }public class EnhancedMediatorDemo {public static void main(String[] args) {EnhancedMediator mediator = new EnhancedMediator();ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);mediator.register(colleagueA);mediator.register(colleagueB);colleagueA.send("Hello, B!");colleagueB.send("spam message"); // 这条消息将被阻止}
    }
    
  3. 中介者的状态管理

    中介者可以维护状态信息,协调同事对象的状态。

    代码示例:状态管理

    class StateMediator implements Mediator {private List<Colleague> colleagues = new ArrayList<>();private String state;@Overridepublic void register(Colleague colleague) {colleagues.add(colleague);}public void setState(String state) {this.state = state;notifyColleagues();}private void notifyColleagues() {for (Colleague colleague : colleagues) {colleague.receive("State updated to: " + state);}}@Overridepublic void send(String message, Colleague sender) {// 这里可以实现其他交互逻辑}
    }public class StateMediatorDemo {public static void main(String[] args) {StateMediator mediator = new StateMediator();ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);mediator.register(colleagueA);mediator.register(colleagueB);mediator.setState("Active");}
    }
    

通过这些示例,中介者模式的灵活性和应用场景得以体现,可以根据具体需求实现多种变形用法。


http://www.mrgr.cn/news/60406.html

相关文章:

  • Java案例总结
  • HTB:Devvortex[WriteUP]
  • python编程-闭包
  • MambaVision
  • Elasticsearch分词器基础安装
  • 包装类Integer
  • JAVA运算符详解
  • 【山西】《信息化项目软件运维费用测算指南》(DB 14/T 2163-2020)-省市费用标准解读系列01
  • AutoSAR从0开始到入门培训
  • 学校会拒绝孤独症孩子吗?揭秘专业教育机构的关怀之心
  • 力扣hot100-->递归/回溯
  • 【Elsa 3】Elsa 3 中的一些基本概念梳理
  • Cobalt Strike隐藏特征与混淆流量
  • 元空间--JVM基础(8)
  • 拍拍贷鸿蒙版H5容器之路
  • 项目管理平台如何体现工程项目管理的主要特征?
  • 数据分析-38-关于互联网企业黑名单的探索
  • HarmonyOS NEXT应用元服务开发控件状态变化场景
  • Faster R-CNN
  • 2024第二届新能源汽车热管理论坛
  • 尚硅谷 | Nginx | 学习笔记
  • 开始实施!《商业银行业务档案管理规范》(DA/T 98-2023)
  • 【AI大模型】使用谷歌 Gemini API 构建自己的 ChatGPT(二)
  • Hugging Face | 个人使用笔记
  • Node-RED的面板的认识及操作
  • Linux第二讲:Linux权限理解