观察者模式

参考书籍:《java设计模式》 刘伟
最近在看这本书,以前也看过,但是没有记录和自己的理解,所以最近因为疫情,公司不是很忙,记录下几个设计模式的理解。

基础应用

观察者模式定义如下: 观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,
使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式
的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器
(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。
在这里插入图片描述

经典代码:

abstract class Subject {
    //定义一个观察者集合用于存储所有观察者对象
    protected ArrayList observers<Observer> = new ArrayList();
    //注册方法,用于向观察者集合中增加一个观察者
    public void attach(Observer observer) {
        observers.add(observer);
    }
    //注销方法,用于在观察者集合中删除一个观察者
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    //声明抽象通知方法
    public abstract void notify();
}
具体目标类ConcreteSubject是实现了抽象目标类Subject的一个具体子类,其典型代码如下所示:
[java] view plain copy
class ConcreteSubject extends Subject {
    //实现通知方法
    public void notify() {
        //遍历观察者集合,调用每一个观察者的响应方法
        for(Object obs:observers) {
            ((Observer)obs).update();
        }
    }
}
抽象观察者角色一般定义为一个接口,通常只声明一个update()方法,为不同观察者的更新
(响应)行为定义相同的接口,这个方法在其子类中实现,不同的观察者具有不同的响应方
法。抽象观察者Observer典型代码如下所示:

interface Observer {
    //声明响应方法
    public void update();
}

在具体观察者ConcreteObserver中实现了update()方法,其典型代码如下所示:

class ConcreteObserver implements Observer {
    //实现响应方法
    public void update() {
    //具体响应代码
    }
}

jdk对观察者模式的支持

(img-lwdu9uu7-1583993330397)(FB655AE2D1F54834B7DE0287D796622B)]

观察者模式与事件

在DEM模型((DelegationEvent Model, DEM),即一个Java组件所引发的事件并不由引发事件的对象自己来负
责处理,而是委派给独立的事件处理对象负责。)中,目标角色(如界面组件)负责发布事件,而观察者角色(事件处理者)可以
向目标订阅它所感兴趣的事件。当一个具体目标产生一个事件时,它将通知所有订阅者。事
件的发布者称为事件源(Event Source),而订阅者称为事件监听器(Event Listener),在这个过程
中还可以通过事件对象(Event Object)来传递与事件相关的信息,可以在事件监听者的实现类中
实现事件处理,因此事件监听对象又可以称为事件处理对象。事件源对象、事件监听对象
(事件处理对象)和事件对象构成了Java事件处理模型的三要素。事件源对象充当观察目标,
而事件监听对象充当观察者。以按钮点击事件为例,其事件处理流程如下:

(1) 如果用户在GUI中单击一个按钮,将触发一个事件(如ActionEvent类型的动作事件),
JVM将产生一个相应的ActionEvent类型的事件对象,在该事件对象中包含了有关事件和事件
源的信息,此时按钮是事件源对象;
(2) 将ActionEvent事件对象传递给事件监听对象(事件处理对象),JDK提供了专门用于处理
ActionEvent事件的接口ActionListener,开发人员需提供一个ActionListener的实现类(如
MyActionHandler),实现在ActionListener接口中声明的抽象事件处理方法actionPerformed(),
对所发生事件做出相应的处理;
(3) 开发人员将ActionListener接口的实现类(如MyActionHandler)对象注册到按钮中,可以通
过按钮类的addActionListener()方法来实现注册;
(4) JVM在触发事件时将调用按钮的fireXXX()方法,在该方法内部将调用注册到按钮中的事件
处理对象的actionPerformed()方法,实现对事件的处理。
使用类似的方法,我们可自定义GUI组件,如包含两个文本框和两个按钮的登录组件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值