博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者模式
阅读量:7143 次
发布时间:2019-06-29

本文共 2514 字,大约阅读时间需要 8 分钟。

定义

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

观察者模式是一种对象行为型模式。

模式结构

  • Subject:目标 抽象的目标主要抽象的是观察这个的注册和注销,然后一个通知更新的方法
public interface Subject {    /**     * 注册观察者     * @param observer     */    void registerObserver(Observer observer);    /**     *  取消观察者     * @param observer     */    void removeObserver(Observer observer);    /**     * 通知更新     */    void notifyObservers();}复制代码
  • ConcreteSubject: 具体目标
public class NotifyObserver implements Subject{    private List
mObservers; public NotifyObserver() { mObservers = new ArrayList<>(); } @Override public void registerObserver(Observer observer) { mObservers.add(observer); } @Override public void removeObserver(Observer observer) { int i = mObservers.indexOf(observer); if (i >= 0) { mObservers.remove(observer); } } @Override public void notifyObservers() { System.out.print(" >>>>>mObservers.size()>>>>>>>" + mObservers.size()); System.out.println(); for (Observer o: mObservers) { o.update("在吗????"); } }}复制代码
  • Observer: 观察者 抽象的观察者,所有观察者共同拥有的一个接口。
public interface Observer {    /**     * 处理逻辑     * @param s     */    void update(String s);}复制代码
  • ConcreteObserver: 具体观察者 观察者A
public class ObserverA implements Observer{    Subject mSubject;    public ObserverA(Subject subject) {        mSubject = subject;        mSubject.registerObserver(this);    }    @Override    public void update(String s) {        System.out.println("ObserverA:" + s);    }}复制代码

观察者B

public class ObserverB implements Observer{    Subject mSubject;    public ObserverB(Subject subject) {        mSubject = subject;        mSubject.registerObserver(this);    }    @Override    public void update(String s) {        System.out.println("ObserverB : " + s);    }}复制代码

测试代码

public class Test {    public static void main(String[] args) {        Subject subject = new NotifyObserver();        Observer observerA = new ObserverA(subject);        Observer observerB = new ObserverB(subject);        // 通知更新        subject.notifyObservers();        //移除监听        subject.removeObserver(observerA);        System.out.println(">>>>>>>>>>>>>>>>>");        subject.notifyObservers();    }}复制代码

测试结果

>>>>>mObservers.size()>>>>>>>2ObserverA:在吗????ObserverB : 在吗????>>>>>>>>>>>>>>>>> >>>>>mObservers.size()>>>>>>>1ObserverB : 在吗????复制代码

转载地址:http://gszgl.baihongyu.com/

你可能感兴趣的文章
标准Web系统的架构分层
查看>>
MVC4中EasyUI Tree异步加载JSON数据生成树
查看>>
jquery 画板折叠
查看>>
hibernate 缓存
查看>>
AES-GCM算法
查看>>
Apache Pulsar简介
查看>>
Perl引用入门
查看>>
关于端口号你知道多少!
查看>>
用Canvas写一个炫酷的时间更新动画玩玩
查看>>
windows sever2003安装Wamp 2.5不成功——VC 11不支持Windows Server 2003和win XP?
查看>>
分享一下上个星期的香港行程
查看>>
HUT-1675 找啊找啊找GF DP
查看>>
使用jQuery插件jScrollPane开发Mac OSX Lion风格的滚动条
查看>>
使用jQuery开发iOS风格的页面导航菜单
查看>>
SQL:事务(1)
查看>>
js事件定义方式和获取事件对象event总结
查看>>
Erlang练习-UDP
查看>>
ACE定时器
查看>>
tar解压错误
查看>>
Java NIO与IO的差别和比較
查看>>