码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 设计模式——中介者模式(Mediator Pattern)+ JDK相关源码


    文章目录

    • 一、中介者模式(Mediator Pattern)
      • 别名:调停者模式
      • 类型:行为型模式
      • 功能:
    • 二、例子
      • 1、菜鸟教程例子
        • 1.1 定义ChatRoom
        • 1.2 定义User 用户
        • 1.3 使用
      • 2、JDK源码——Timer
    • 四、其他设计模式

    一、中介者模式(Mediator Pattern)

    别名:调停者模式

    类型:行为型模式

    功能:

    提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。
    从而降低多个对象和类之间的通信复杂性。

    二、例子

    1、菜鸟教程例子

    菜鸟教程是举了一个聊天室的例子。
    菜鸟教程——中介者模式
    我做了点小改动,但意思是一样。

    1.1 定义ChatRoom

    这个ChatRoom 就是中介者,专门去处理User的通讯。

    import java.util.Date;
     
    public class ChatRoom {
       public static void showMessage(User user, String message){
          System.out.println(String.format("%s [%s] : %s"), new Data(), user.getName(), message);
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2 定义User 用户

    public class User {
       private String name;
    
       public User(String name){
          this.name  = name;
       }
     
       public void sendMessage(String message){
          ChatRoom.showMessage(this, message);
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1.3 使用

    public class MediatorPatternDemo {
       public static void main(String[] args) {
          User 张三 = new User("张三");
          User 李四 = new User("李四");
     
          张三.sendMessage("Hi! 李四!");
          李四.sendMessage("Hi! 张三!");
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2、JDK源码——Timer

    中介者:Timer
    Timer 会维护一个TaskQueue 。
    添加TimerTask时会调用sched方法,该方法notify通知唤醒队列里的任务。

    public class Timer {
    	private final TaskQueue queue = new TaskQueue();
    	
    	private void sched(TimerTask task, long time, long period) {
    	      if (time < 0)
    	          throw new IllegalArgumentException("Illegal execution time.");
    	
    	      // Constrain value of period sufficiently to prevent numeric
    	      // overflow while still being effectively infinitely large.
    	      if (Math.abs(period) > (Long.MAX_VALUE >> 1))
    	          period >>= 1;
    	
    	      synchronized(queue) {
    	          if (!thread.newTasksMayBeScheduled)
    	              throw new IllegalStateException("Timer already cancelled.");
    	
    	          synchronized(task.lock) {
    	              if (task.state != TimerTask.VIRGIN)
    	                  throw new IllegalStateException(
    	                      "Task already scheduled or cancelled");
    	              task.nextExecutionTime = time;
    	              task.period = period;
    	              task.state = TimerTask.SCHEDULED;
    	          }
    	
    	          queue.add(task);
    	          if (queue.getMin() == task)
    	              queue.notify();
    	      }
    	  }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    四、其他设计模式

    创建型模式
    结构型模式

    • 1、设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码

    行为型模式

    • 1、设计模式——访问者模式(Visitor Pattern)+ Spring相关源码
    • 2、设计模式——中介者模式(Mediator Pattern)+ JDK相关源码
    • 3、设计模式——策略模式(Strategy Pattern)+ Spring相关源码
    • 4、设计模式——状态模式(State Pattern)
    • 5、设计模式——命令模式(Command Pattern)+ Spring相关源码
    • 6、设计模式——观察者模式(Observer Pattern)+ Spring相关源码
    • 7、设计模式——备忘录模式(Memento Pattern)
    • 8、设计模式——模板方法模式(Template Pattern)+ Spring相关源码
    • 9、设计模式——迭代器模式(Iterator Pattern)+ Spring相关源码
    • 10、设计模式——责任链模式(Chain of Responsibility Pattern)+ Spring相关源码
    • 11、设计模式——解释器模式(Interpreter Pattern)+ Spring相关源码
  • 相关阅读:
    k8s入门之Deployment(五)
    【2023年软考架构师】案例真题回忆版
    Keras中reset_states对stateful的影响探究
    一篇文章带你掌握主流办公框架——SpringBoot
    练习作业P1
    入职阿里必会199道SpringCloud面试题,你能掌握多少?
    【Git学习二】时光回溯:git reset和git checkout命令详解
    4、设计模式之单例设计模式
    大数据之Spark(一)
    MySQL高级学习笔记
  • 原文地址:https://blog.csdn.net/malu_record/article/details/134083049
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号