设计模式之观察者模式(发布/订阅模式:publish/subscribe)_rdgk的博客-程序员宝宝

技术标签: Java2018  

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己

观察者模式的关键对象是主题Subject和观察者Observer.一个Subject可以有任意数目依赖它的Observer,

一旦Subject的状态发生了改变,所有的Observer都可以得到通知.Subject发出通知的时候并不需要知道谁是它的Observer.

而且任何具体的观察者也不知道其他观察者是什么

观察者模式的使用场景

当一个对象的改变需要同时改变其他对象,并且不需要知道具体多少需要改变

Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个接口实现.它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者.
抽象主题提供一个接口,可以增加和删除观察者对象.

Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己.这个接口叫做更新接口.抽象观察者一般用一个抽象类或者一个接口实现.
更新接口通常包含一个Update()方法,这个方法叫做更新方法.

ConcreteSubject类,叫做具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知.
具体主题角色通常用一个具体子类实现

    public static void main(String[] args) {
        SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();
        //创建微信用户
        WeixinUser user1=new WeixinUser("a");
        WeixinUser user2=new WeixinUser("b");
        WeixinUser user3=new WeixinUser("c");
        //订阅公众号
        mSubscriptionSubject.add(user1);
        mSubscriptionSubject.add(user2);
        mSubscriptionSubject.add(user3);
        mSubscriptionSubject.notify("d的专栏更新了");
    }

 

/**
 * 微信用户是观察者,微信公众号是被观察者,有多个的微信用户关注了一个公众号
 * 当这个公众号更新时就会通知这些订阅的微信用户
 *抽象观察类
 * @author guk
 *
 */
public interface Observer {
    public void update(String message);
}

/**
 * 具体观察者 ConcreteObserver
 * @author guk
 *
 */
public class WeixinUser implements Observer {
    //微信用户名
    private String name;
    
    public WeixinUser(String name) {
        super();
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name+"-"+message);
    }
}

/**
 * 抽象被观察者类Subject
 * @author guk
 *
 */
public interface Subject {
    
    /**
     * 增加订阅者
     * @param observer
     */
    void add(Observer observer);
    /**
     * 删除订阅者
     * @param observer
     */
    void delete(Observer observer);
    /**
     * 通知订阅者更新消息
     * @param message
     */
    void notify(String message);
}
 

/**
 * 具体被观察者(ConcreteSubject)
 * @author guk
 *
 */
public class SubscriptionSubject implements Subject {
    //储存订阅公众号的微信用户
    private List<Observer> weixinUserList=new ArrayList<Observer>();
    
    @Override
    public void add(Observer observer) {
        weixinUserList.add(observer);
    }

    @Override
    public void delete(Observer observer) {
        weixinUserList.remove(observer);
    }

    @Override
    public void notify(String message) {
        for(Observer observer:weixinUserList) {
            observer.update(message);
        }
    }

}
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38005943/article/details/82114562

智能推荐

【面向对象-07】继承、重写(重载)、子类对象的实例化过程、super、this关键字指向_百里慕溪的博客-程序员宝宝

目录1.继承1). 继承的优势2). Java中继承的特点3). 继承子类中关键字4). 继承中子类、父类成员(变量/方法)的特点5). 子类重写 (覆盖) 父类中方法(1). 何时重写(2). 重写条件(3). 重写、重载区别2.子类对象的实例化过程1). 子类能否覆盖父类的构造方法2). 隐式super语句和显式super语句3). 使用super语句的注意事项4). 总结super语句3.子类this的真实指向1). 子类对象实例化过

mysql socket timeout设置_聊聊jdbc socketTimeout的设置_Phoenix Cat的博客-程序员宝宝

序本文主要介绍下jdbc的socket timeout的设置jdbc timeout类别主要有如下几个类别transaction timeout设置的是一个事务的执行时间,里头可能包含多个statementstatement timeout(也相当于result set fetch timeout)设置的是一个statement的执行超时时间,即driver等待statement执行完成,接收到数...

Qt进行urlEncode/urlDecode_urlencode qt_qyvlik的博客-程序员宝宝

Qt 进行url编/解码时要注意的一些问题。

android activity 通信,Android:Activity与Fragment通信(99%)完美解决方案_Top Liu的博客-程序员宝宝

前言最近一直在想着能否有一种更好的方案来解决:Android中Activity与Fragment之间通信的问题,什么叫更好呢,就是能让Fragment的复用性高,性能还有好(不用反射),代码还要好维护,不需要为每对Activity和Fragment之间定义接口而发愁。先简单说下Javascript这门语言吧,或许有人就会问:咱们不是聊Android的java问题吗?怎么话题转到JavaScript...

Qt的Tcp服务器多线程编程-附带代码展示_qt 多线程服务器_黑小孩的博客-程序员宝宝

Qt的Tcp服务器多线程编程-附带代码展示该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端,此文章没有实现客户端的多线程编程。创建子线程时需要注意的点:1、子线程与主线程之间交互数据时,应采用信号槽的方式2、子线程中实例化的对象,不应出现在其他线程当中3、子线程需加入QThread::exec()事件循环函数4、子线程的销毁关联窗口的销毁信号,调用exit()、quit()、deleteLater()期间所遇到的问题:1、之前的思路是想在子线程当中去监听客户端的连接以及数据处理

随便推点

《15款最好用的新浪短链接(t.cn接口)在线生成工具》_酷牛短链接_cccccboot的博客-程序员宝宝

国内最好用的则是新浪的T.CN短网址,使用用的人非常多,不进稳定,而且访问的速度也是非常的快的.今天就给大家推荐几家可以在线生成新浪T.CN短链接的的工具!1.冷狗短链接地址:http://dogdwz.cn/冷狗短链接那边提供最新的新浪T.CN短网址在线压缩器,每天都可以去免费生成新的短链接,他们采用的是T.CN官方的原生态生成APP KEY,生成了之后是可以永久使用的。2.麦云短链接...

cacti+apache+php+mysql+rrdtool搭建流量监控平台_unity<兆>的博客-程序员宝宝

1,apache的安装详细的不说,傻瓜安装法./configue --prefix=dir/apache2 --enable-so(./configure --prefix=/opt/apache --enable-module=so)makemake install设置开机启动 vi /etc/rc.d/rc/local  添加:/opt/apache/bin/apach

MAC地址格式详解_mac地址ig位_蘑菇ding的博客-程序员宝宝

MAC地址格式详解以太网编址在数据链路层,数据帧通常依赖于MAC地址来进行数据交换,它如同公网IP地址一样要求具有全球唯一性,这样才可以识别每一台主机。那么MAC地址如何做到这点?它的格式又是什么?MAC地址,英文全称Medium Access Control,直译为介质访问控制,它通常被固化在每个以太网网卡(NIC,Network Interface Card)。MAC(硬件)地址长48位(6字节),采用十六进制格式,下图说明了48位的MAC地址及其组成部分。 ...

.net core-AOP实现日志模块_dxm809的博客-程序员宝宝

using AspectCore.DynamicProxy;using Microsoft.Extensions.DependencyInjection;using System;using System.Threading.Tasks;using AspectCore.Extensions.DependencyInjection;namespace AOP_Demo{ c...

程序员网站SEO指南_weixin_34198453的博客-程序员宝宝

本文结合自己的小站PHP10086博客网浅谈一下程序员的SEO策略指南 程序员个人网站特点 自己是技术出身,很少看重seo,或者不知道怎么seo自己的网站 没有时间发什么水帖之类的宣传自己的网站 也没有研究过seo,尤其是个人博客性质的小站 程序员网站:更多的是把网站作为个人交流的平台,而没有把他作为盈利工具,很少关注seo 结合自己浅谈一下程序员seo之道...

C++下字符串与无符号数之间的转换_c++ hexstr转 unsigned char *_天天放假的博客-程序员宝宝

/** * @brief GetString0x16 byte数组转string(16进制格式) * @param bArray 数组 * @param bArray_len 数组长度 * @param offset 偏移量 * @param size 待处理字节数 * @return 16进制形式字符串 */ ...

推荐文章

热门文章

相关标签