资讯专栏INFORMATION COLUMN

观察者模式

魏宪会 / 421人阅读

摘要:细思不恐主旨在设计模式中,观察者模式的主旨则是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

简单说两句

观察者模式,是对象行为型模式中的一种,有的时候人们也叫他发布/订阅模式。当我们需要在一个对象状态改变的时候通知到其它对象,这时候就可以考虑一下观察者模式。

细思不恐

主旨

在设计模式中,观察者模式的主旨则是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

解惑

在上面我们说到,有时观察者模式也称发布/订阅模式,那到底有啥区别呢?其实发布订阅模式是处于广义上的观察者模式,因为他是最常用的一种观察者模式的实现。

发布订阅模式相对观察者多了一个事件的通道,因为在观察者模式中,观察者(Observer)需要直接订阅目标(Subject)事件,在目标发出内容更改事件时,直接接收内容事件并做出响应。在发布订阅模式中订阅者需要从时间的通道中订阅事件,这样从发布者接收事件以及向订阅者发布事件,两者并没有产生依赖的关系。

具体代码上的区别,有兴趣的朋友可以在下方留言,下次可以出一个小分支。

实现方式

在上面的介绍中,我们大概知道了在观察者模式中,有这么两种主角色:

Subject(被观察者)

被观察者必须要有添加观察者、删除观察者和提醒观察者的方法。

Observer(观察者)

观察者要有更新方法,用来做出响应在状态改变调用提醒方法后。

Java中已经提供了观察者模式的实现,我们不需要再定义观察者和目标接口(被观察者),也不需要维护观察者的注册信息。可以继承Observable类实现被观察者目标对象,实现Observer接口完成具体的观察者对象,其中提供了update方法获取相应事件信息。

在这里为了方便说明观察者的基本原理,自己实现一个简单的案例。

首先抽象一个观察者类,里面有一个抽象方法更新状态。

public abstract class Oberver{
    public abstract void Update();
}

然后再写一个抽象被观察者类。

public abstract class Subject{
    //增加  
    public abstract void Attach(Observer observer);  
    //移除  
    public abstract void Detach(Observer observer);  
    //通知  
    public abstract void Notify();
}

具体上面两个类:

//具体的观察者  
public class ConcreteObserver  extends Observer{  

    @Override  
    public void Update() {
        System.out.println("状态改变,更新状态");  
    }
}  

//具体被观察者类  
public class ConcreteSubject extends Subject {  
      
    //定义集合存储观察者  
    List list=new ArrayList();  
      
    //增加观察者
    @Override  
    public void Attach(Observer observer) {  
        list.add(observer);  
    }  
  
    @Override  
    public void Detach(Observer observer) {  
        list.add(observer);  
    }  
  
    @Override  
    public void Notify() {  
        //遍历集合观察者对象  
        for(Observer observer:list){  
            observer.Update();  
        }
    }  
}  

接下来我们就可以写测试类了:

public class ObserverDemo {  
    public static void main(String[] args) { 
    
        //创建被观察者对象  
        ConcreteSubject csb=new ConcreteSubject();  
        //创建观察者对象
        ConcreteObserver cob=new ConcreteObserver();  
          
        //将观察者添加到被观察者的通知名单内  
        csb.Attach(cob);  
          
        //被观察者发出通知,观察者接受通知更新状态  
        csb.Notify();  
    }  
} 

//输出
“状态改变,更新状态”

就这样,一个简单的观察者模式的案例就结束了。当然一个复杂的应用中,我们肯定需要一个完整而且适用与多线程以及异步系统,因为观察者模式大都应用与这两中系统,所以也需要考虑线程安全的问题。下次会介绍更加详细完整的观察者的实现方式。

写在最后

因为每一篇的篇幅不宜过长,所以本打字员尽量在精简自己所写的内容,尽量能够多容扩一些知识点,但是具体的知识横向扩展可能就有一点欠缺,这也算是对自己的一种锻炼,希望大家能够一起进步,怎么样,在下面留个言吐槽一下本渣渣吧。(逃

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68859.html

相关文章

  • 设计模式察者设计模式

    摘要:关键概念理解观察者设计模式中主要区分两个概念观察者指观察者对象,也就是消息的订阅者被观察者指要观察的目标对象,也就是消息的发布者。 原文首发于微信公众号:jzman-blog,欢迎关注交流! 最近补一下设计模式相关的知识,关于观察者设计模式主要从以下几个方面来学习,具体如下: 什么是观察者设计模式 关键概念理解 通知观察者的方式 观察者模式的实现 观察者模式的优缺点 使用场景 下面...

    NotFound 评论0 收藏0
  • 设计模式察者模式与发布订阅模式

    摘要:观察者模式与发布订阅的区别在模式中,知道,同时还保留了的记录。发布者订阅者在大多情况下是异步方式使用消息队列。图片源于网络侵权必删如果以结构来分辨模式,发布订阅模式相比观察者模式多了一个中间件订阅器,所以发布订阅模式是不同于观察者模式的。 学习了一段时间设计模式,当学到观察者模式和发布订阅模式的时候遇到了很大的问题,这两个模式有点类似,有点傻傻分不清楚,博客起因如此,开始对观察者和发布...

    BaronZhang 评论0 收藏0
  • 设计模式 -- 察者模式

    摘要:总结一下从表面上看观察者模式里,只有两个角色观察者被观察者而发布订阅模式,却不仅仅只有发布者和订阅者两个角色,还有第三个角色经纪人存在。参考链接观察者模式发布订阅模式 做了这么长时间的 菜鸟程序员 ,我好像还没有写过一篇关于设计模式的博客...咳咳...意外,纯属意外。所以,我决定,从这一刻起,我要把设计模式在从头学习一遍,不然都对不起我这 菜鸟 的身份。那这次,就从观察者模式开始好啦...

    chengtao1633 评论0 收藏0
  • 设计模式 -- 察者模式

    摘要:总结一下从表面上看观察者模式里,只有两个角色观察者被观察者而发布订阅模式,却不仅仅只有发布者和订阅者两个角色,还有第三个角色经纪人存在。参考链接观察者模式发布订阅模式 做了这么长时间的 菜鸟程序员 ,我好像还没有写过一篇关于设计模式的博客...咳咳...意外,纯属意外。所以,我决定,从这一刻起,我要把设计模式在从头学习一遍,不然都对不起我这 菜鸟 的身份。那这次,就从观察者模式开始好啦...

    makeFoxPlay 评论0 收藏0
  • 订阅发布模式察者模式的区别

    摘要:或许以前认为订阅发布模式是观察者模式的一种别称,但是发展至今,概念已经有了不少区别。参考文章订阅发布模式和观察者模式真的不一样 首选我们需要先了解两者的定义和实现的方式,才能更好的区分两者的不同点。 或许以前认为订阅发布模式是观察者模式的一种别称,但是发展至今,概念已经有了不少区别。 订阅发布模式 在软件架构中,发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特...

    ysl_unh 评论0 收藏0
  • 我的Java设计模式-察者模式

    摘要:为了帮助灰太狼摆脱被老婆平底锅抽的悲剧,发起了解救灰太狼的行动,必须要知道观察者模式。持有观察者对象的集合。设计模式源码下载 相信大家都有看过《喜洋洋与灰太狼》,说的是灰太狼和羊族的斗争,而每次的结果都是灰太狼一飞冲天,伴随着一句我还会回来的......。为灰太狼感到悲哀,抓不到羊,在家也被老婆平底锅虐待。灰太狼为什么会这么背? 很简单,灰太狼本身就有暴露行踪的属性,羊咩咩就能知晓灰太...

    smartlion 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<