0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

设计模式行为型:观察者模式

冬至子 来源:码农架构 作者:小智 2023-06-07 16:56 次阅读

定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅模式、模型-视图模式、源-监听器模式或从属者模式。

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

结构图

图片

结角色与理解

  • 观察者模式共分为四种角色:
    • Subject(目标类):被观察的对象,内部定义一个观察者集合,并提供管理方法,定义通知方法notify()。
    • ConcreteSubject(具体目标类):继承目标类,实现notify中具体的方法,可省略。
    • Observer(观察者):对目标类做出的变化进行反应,一般为接口,声明更新方法update()。
    • ConcreteObserver(具体观察者):继承观察者,一般持有指向具体目标类的引用,实现update方法,调用具体 目标类完成具体的业务操作。
  • 首先对目标类和观察者进行抽象以便后期对程序进行扩展,目标类持有观察者的引用,实现自身变化时对观察者更新方法的调用。

核心代码

• 目标类

public abstract class AbstractSubject {
    protected List< Observer > observers = new ArrayList<  >();
    public void attach(Observer observer) {
        observers.add(observer);
    }
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    public abstract void notify(Object args);
}
• 具体目标类
public class ConcreteSubject extends AbstractSubject {
    @Override
    public void notify(Object args) {
        System.out.println("目标类更改了状态");
        for (Observer observer : this.observers) {
            observer.update();
        }
    }
}

• 观察类

public interface Observer {
    void update();
}

• 具体观察类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConcreteObserver implements Observer {
    private String name;
    @Override
    public void update() {
        System.out.println(this.name + "已更新");
    }
}

• 客户端

public class Client {
    public static void main(String[] args) {
        AbstractSubject as = new ConcreteSubject();
        as.attach(new ConcreteObserver("观察者A"));
        as.attach(new ConcreteObserver("观察者B"));
        as.attach(new ConcreteObserver("观察者C"));
        as.notify("");
    }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 监听器
    +关注

    关注

    0

    文章

    11

    浏览量

    14435
收藏 人收藏

    评论

    相关推荐

    CC2540广播角色和观察者角色切换代码怎么编写?

    希望一个CC2540先通过观察者角色获取其他广播的广播数据,然后在切换为广播角色将这些数据广播给另外一个观察者?这样就需要编程实现观察者
    发表于 03-16 10:27

    RN4020观察者模式无法正常工作怎么回事

    中心,支持MLDP,并使UART流控制R,1//重新引导,使更改生效J,1//观察者模式你对这个问题有什么想法?谢谢,弗朗西斯科
    发表于 04-22 09:03

    属性观察者的特点

    属性观察者,类似于触发器。用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应。有如下特点: 1,不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet
    发表于 11-04 07:10

    观察者模式在嵌入式编程设计中有何作用

    观察者模式是最常见的模式之一。这种模式提供一种方法来时对象“监听”其他对象,而不需要修改任何数据服务器。在嵌入式领域,这意味着数据能够很容易分享给其他元素。
    发表于 12-22 08:31

    基于观察者模式的屏幕布局控件设计

    观察者模式作为设计模式行为模式的一种,解决了上述具有一对多依赖关系对象重用问题。文中在分析观察者
    发表于 02-13 16:20 4次下载
    基于<b class='flag-5'>观察者</b><b class='flag-5'>模式</b>的屏幕布局控件设计

    Java设计模式分析之观察者

    观察者模式的流程跟报纸订阅方式一致,即:观察者模式=出版+订阅,只是名称不一样,出版
    发表于 09-26 17:36 0次下载

    在 Java8 环境下实现观察者模式的实例分析

    观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式,是四人组(GoF,即 Erich Gamma、Richard Helm、Ralph Johnson
    发表于 10-12 16:09 0次下载
    在 Java8 环境下实现<b class='flag-5'>观察者</b><b class='flag-5'>模式</b>的实例分析

    设计模式行为:策略模式

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式
    的头像 发表于 06-07 11:18 621次阅读
    设计<b class='flag-5'>模式</b><b class='flag-5'>行为</b><b class='flag-5'>型</b>:策略<b class='flag-5'>模式</b>

    设计模式行为:状态模式

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为模式
    的头像 发表于 06-07 11:20 564次阅读
    设计<b class='flag-5'>模式</b><b class='flag-5'>行为</b><b class='flag-5'>型</b>:状态<b class='flag-5'>模式</b>

    设计模式行为:访问模式

    在访问模式(Visitor Pattern)中,我们使用了一个访问类,它改变了元素类的执行算法。
    的头像 发表于 06-07 15:11 712次阅读
    设计<b class='flag-5'>模式</b><b class='flag-5'>行为</b><b class='flag-5'>型</b>:访问<b class='flag-5'>者</b><b class='flag-5'>模式</b>

    行为设计模式在UVM中的应用

    接下来介绍行为设计模式在UVM中的应用。
    的头像 发表于 08-09 14:01 641次阅读
    <b class='flag-5'>行为</b><b class='flag-5'>型</b>设计<b class='flag-5'>模式</b>在UVM中的应用

    观察者模式,超详细!

    观察者模式建议你为发布类添加订阅机制, 让每个对象都能订阅或取消订阅发布事件流。 不要害怕! 这并不像听上去那么复杂。 实际上, 该机制包括 1) 一个用于存储订阅
    的头像 发表于 08-21 16:06 1109次阅读
    <b class='flag-5'>观察者</b><b class='flag-5'>模式</b>,超详细!

    基于观察者模式设计的框架-REB,使代码模块化

    带给我们特性,他能对我们框架设计提供什么好处。 什么是观察者模式 观察者模式(Observer Pattern)是一种行为设计
    的头像 发表于 10-17 09:35 620次阅读
    基于<b class='flag-5'>观察者</b><b class='flag-5'>模式</b>设计的框架-REB,使代码模块化

    一文解析BLE观察者模式回调机制

    nRF5 SDK从版本14开始,对事件回调机制做了更新,引入了观察者模式,以解耦不同BLE Layer对BLE事件的回调函数。
    的头像 发表于 11-27 10:07 899次阅读
    一文解析BLE<b class='flag-5'>观察者</b><b class='flag-5'>模式</b>回调机制

    什么是观察者设计模式?Golang中的观察者模式介绍

    当涉及到订单处理系统时,观察者设计模式可以用于实现订单状态的变化和通知。
    的头像 发表于 01-08 10:08 390次阅读