文档章节

设计模式 之 观察者模式

GMarshal
 GMarshal
发布于 11/13 10:11
字数 427
阅读 15
收藏 1

设计模式 之 观察者模式

场景

场景比较简单,当一个对象的状态发生改变时,自动通知所有依赖(或观察)它的对象。

比如:发布/订阅

原理:发布者存储N个订阅者的对象信息,当发布者发布消息时,循环调用所有的订阅者的指定方法。

源码

发布者:Publisher

/**
 * 发布者
 * @author GaoYuan
 * @date 2018/11/11 上午9:55
 */
public class Publisher {

    private List<Subscriber> subscriberList = new ArrayList<>();

    /** 发布消息 */
    public void publish(String msg){
        for(Subscriber subscriber:subscriberList){
            subscriber.answer(msg);
        }
    }

    /** 订阅 */
    public void add(Subscriber subscriber){
        subscriberList.add(subscriber);
    }
}

订阅者抽象类:Subscriber

/**
 * 订阅者
 * @author GaoYuan
 * @date 2018/11/11 上午9:56
 */
public abstract class Subscriber {

    abstract void answer(String msg);

    /** 订阅 */
    void subscribe(Publisher publisher){
        publisher.add(this);
    }

}

具体订阅者

public class OneSub extends Subscriber{
    @Override
    public void answer(String msg) {
        System.out.println("OneSub 接收消息:" + msg);
    }
}
public class SecondSub extends Subscriber{
    @Override
    public void answer(String msg) {
        System.out.println("SecondSub 接收消息:" + msg);
    }
}

测试类:

public static void main(String[] args){
    Publisher publisher = new Publisher();

    // 订阅
    OneSub one = new OneSub();
    one.subscribe(publisher);

    SecondSub second = new SecondSub();
    second.subscribe(publisher);

    // 发布消息
    publisher.publish("测试消息");
}

输出结果如下:

OneSub 接收消息:测试消息
SecondSub 接收消息:测试消息

码云

https://gitee.com/gmarshal/foruo-learn-java/tree/master/src/main/java/com/foruo/learn/designmode/observer

博客

https://my.oschina.net/gmarshal/blog/2875336

欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

输入图片说明

© 著作权归作者所有

共有 人打赏支持
GMarshal
粉丝 19
博文 58
码字总数 46067
作品 0
南京
程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
11/06
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
Ubuntu中vi卸载与安装/使用模式

Ubuntu中安装的vi是vim-common版本,与centos系统中vi使用方式不同,编辑使用不惯, 遂卸载重装,卸载命令:sudo apt-get remove vim-common 卸载完毕后重新安装;输入命令:sudo apt-get in...

唐十三郎
11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

全屋WiFi彻底无死角 这才是终极解决方案

无线网络现在不仅在家庭中不可或缺,在酒店、医院、学校等场景中的需求也越来越多。尤其是这些场景中,房间多但也需要每个房间都能够完美覆盖WiFi,传统的吸顶式AP就无法很好的解决问题。 H3...

linux-tao
18分钟前
0
0
Python日期字符串比较

需要用python的脚本来快速检测一个文件内的二个时间日期字符串的大小,其实实现很简单,首先一些基础的日期格式化知识如下 复制代码 %a星期的简写。如 星期三为Web %A星期的全写。如 星期三为...

dragon_tech
19分钟前
0
0
ORA 各种oraclesql错误

ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某...

青峰Jun19er
23分钟前
2
0
没错,老板让我写个 BUG!

前言 标题没有看错,真的是让我写个 bug! 刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动。这可是我特长啊;终于可以光明正大的写 bug 了🙄。 先来看看具体是要干啥吧,其实主要就是...

crossoverJie
36分钟前
34
0
开源软件会被云杀死吗 ?

本文转载云头条,原作者:Michael Stiefel是Reliable Software公司的负责人,是一名软件架构和开发顾问。 文章要点 虽然开源开发不会消失,但商业开源厂商的未来不是很有希望。随着全面管理的...

linuxCool
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部