首页 > 其他分享 >设计模式学习(十三):观察者模式

设计模式学习(十三):观察者模式

时间:2022-11-11 21:47:53浏览次数:74  
标签:十三 void 观察者 模式 public 设计模式 event

设计模式学习(十三):观察者模式

作者:Grey

原文地址:

博客园:设计模式学习(十三):观察者模式

CSDN:设计模式学习(十三):观察者模式

观察者模式

观察者模式是一种行为型模式。在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。

一般可以用做事件处理往往和责任链模式搭配使用, 举个例子:

界面上的按钮上一般都可以绑定事件,当我们按下按钮的时候,可以触发这些事件的执行,这里就可以用观察者模式来做, 我们先定义按钮这个对象

public class Button {
    private List<ActionListener> listeners = new ArrayList<>();

    public void addActionListener(ActionListener listener) {
        this.listeners.add(listener);
    }

    @Override
    public String toString() {
        return "Button{" + "listeners=" + listeners + '}';
    }

    public void buttonPressed() {
        ActionEvent event = new ActionEvent(System.currentTimeMillis(), this);
        listeners.forEach(item -> item.actionPerformed(event));
    }
}

由上可知,Button 中持有了一个列表,这个列表里面装的就是所有事件的列表,我们可以把事件绑定到这个按钮的事件列表中,这样就可以实现按钮执行 press 操作的时候,把对应的事件触发执行了

public interface ActionListener {
    void actionPerformed(ActionEvent event);
}

模拟两个监听事件

public class Listener1 implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent event) {
        System.out.println("Listener 1 listened it source: [" + event.getSource() + "], when is [" + event.getWhen() + "]");
    }
}
public class Listener2 implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent event) {
        System.out.println("Listener 2 listened it source: [" + event.getSource() + "], when is [" + event.getWhen() + "]");
    }
}

主方法在调用的时候,将按钮绑定上述两个监听事件:

public class Main {
    public static void main(String[] args) {
        Button button = new Button();
        button.addActionListener(new Listener1());
        button.addActionListener(new Listener2());
        button.buttonPressed();
    }
}

当执行

button.buttonPressed()

的时候,对应的 listener1 和 listener2 就可以执行了。

上述过程的 UML 图如下

image

观察者模式的应用

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

标签:十三,void,观察者,模式,public,设计模式,event
From: https://www.cnblogs.com/greyzeng/p/16882100.html

相关文章

  • C#设计模式之建造者模式
      原文网址:https://www.jb51.net/article/254976.htm场景:我们的冒险家,现在需要去武器商店买一把兵器,有刀和剑两种武器,冒险者可以告诉武器商人需要哪一种武器,然后武器商......
  • 软件设计模式白话文系列(六)代理模式
    1、描述代理模式属于结构型模式中的一种,通过对代理对象的调用来达到对原对象的增强、减弱作用。通过代理类的生成时机,我们将编译期就生成代理类的情况称之为静态代理模式,......
  • CH58X/CH57X/V208 Observer(观察者)例程讨论讲解
    使用的是沁恒的CH582M的Observer例程与官方的demo板。本例程的功能是主机扫描到从机的MAC地址并打印出来。先对宏定义进行理解讨论。 最大响应扫描数为8,在串口调试助......
  • 第十三章学习笔记
    TCP/IP和网络编程本章论述了TCP/IP和网络编程,分为两个部分。第一部分论述了TCP/IP协议及其应用,具体包括TCP/IP栈、IP地址、主机名、DNS、IP数据包和路由器;介绍了TCP/P网......
  • Android实战简易教程-第三十三枪(自定义View实现控件晃动提示效果)
    用户登录注册页面,在进行数据提交之前我们一般都要进行初步判断,判断用户是否输入内容,在内容为空时我们一般进行Toast提示,今天我们实现另一种提示效果–控件晃动。接着上一......
  • Android实战简易教程-第四十三枪(Shell Script 运行Command)
    android系统运行于DalvikVM中,有着与Linux雷士的ShellCommand指令,可通过Runtime().getRuntime().exec()来运行指令。下面我们就通过代码来实现这一功能,体验一下命令行。1.a......
  • 20201306吴龙灿第十三章学习笔记
    知识点归纳第十三章TCP/IP和网络编程学习目标通过本章的学习,了解TCP/IP协议及其应用,包括TCP/IP协议栈,ip地址,主机名,DNS,IP数据包和路由器;理解TCP/IP协议簇中的UDP和TCP......
  • 20201208史逸霏第十三章学习笔记
    第十三章读书笔记13.1TCP/IP协议IPv432位地址IPv6128位地址TCP/IP的哥哥层级以及每一层及的代表性组件及其功能顶层是使用TCP/IP的应用程序,用于登录到远程主机......
  • 设计模式学习(十一):组合模式
    设计模式学习(十一):组合模式作者:Grey原文地址:博客园:设计模式学习(十一):组合模式CSDN:设计模式学习(十一):组合模式组合模式组合模式是一种结构型模式。组合模式中,最常用的一......
  • 初识设计模式 - 解释器模式
    简介在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则。解释器设计模式(InterpreterDesignPattern)......