博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式17——Observer设计模式
阅读量:6288 次
发布时间:2019-06-22

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

hot3.png

Observer观察者设计模式用于将对象的变化通知给感兴趣的用户。在Observer模式中的角色为主题(subject)与观察者(observer),观察者订阅它感兴趣的主题,一个主题可以被多个观 察者订阅,当主题的状态发生变化时,它必须通知(notify)所有订阅它的观察者,观察者检视主题的状态变化,并作出对应的动作,所以Observer模式也称之为Publish-Subscribe模式。 Observer观察者设计模式结构如下:

观察者模式顺序图如下:

以一个电子商务网站商品价格变时通知订阅用户为例,演示Observer观察者设计模式,代码如下:

//主题interface Subject{    //注册观察者    public void registerObserver(Observer o);    //注销观察者    public void unregisterObserver(Observer o);    //通知观察者    public void notifyObservers();}//观察者interface Observer{    //更新价格信息    public void update(float price);}//商品class Product implements Subject{    //观察者列表    private List
observers = new ArrayList
();    private float price;    public void registerObserver(Observer o){        observers.add(o);    }    public void unregisterObserver(Observer o){        observers.remove(o);    }    public void notifyObservers(){        for(Observer observer : observers){            //主题向观察者推送更新数据            observer.update(price);        }    }    public void priceChanged(){        notifyObservers();    }    public void setPrice(float price){        this.price = price;        priceChanged();    }}//订阅者class Subscriber implements Observer{    private float currentPrice;    //观察者引用主题    private Subject product;    public Subscriber(Subject product){        this.product = product;        //主题注册观察者        product.registerObserver(this);    }    public void update(float price){        this. currentPrice = price;        System.out.println(“Current price change to:” + currentPrice);    }}public class ObserverDemo{    public static void main(String[] args){        Subject product = new Product();        Subscriber subscriber = new Subscriber(product);        product.setPrice(10.98);        product.setPrice(998.15);    }}

在java的java.util中内置了Observer观察者设计模式,其中:

(1).java.util.Observable是主题类,所有继承了该类的类是事件发生的主题,也是被观察的对象。java.util.Observable的常用方法有:

a.public void addObserver(Observer o):为主题添加观察者。

b.publicvoid deleteObserver(Observer o):删除某个观察者。

c.publicvoid deleteObservers():删除主题上的所有观察者。

d.publicboolean hasChanged():测试主题是否改变。

e.protectedvoid setChanged():标记该主题对象已经改变。

f.publicvoid notifyObservers():通知所有观察者对象已经已经改变。

(2).java.util.Observer接口是观察者,所有实现了该接口的类都是主题事件的观察者,该接口只有一个方法需要实现:

publicvoid update(Observable o,  Object arg):通知观察者更新已经改变的主题。

使用JDK内置的Observer观察者设计模式,演示电子商务网站商品价格的例子如下:

//商品class Product extends Observable{    private float price;    public void priceChanged(){        //设置变化点        setChanged();        //通知观察者        notifyObservers();    }    public void setPrice(float price){        this.price = price;        priceChanged();    }    public float getPrice(){        return price;    }}//订阅者class Subscriber implements Observer{    private float currentPrice;    //观察者引用主题    private Observable observable;    public Subscriber(Observable observable){        this. observable = observable;        //主题注册观察者        observable.addObserver(this);    }    public void update(Observable observable, Object arg){        if(observable instanceof Product){            Product product = (Product) observable;            this. currentPrice = product.getPrice();            System.out.println(“Current price change to:” + currentPrice);        }    }}public class ObserverDemo{    public static void main(String[] args){        Observable product = new Product();        Subscriber subscriber = new Subscriber(product);        product.setPrice(10.98);        product.setPrice(998.15);    }}

Observer观察者设计模式在界面编程中应用广泛,一个button往往会注册一个onclickListener,里面有onclickAction方法对点击进行响应,此时button充当的就是主题,而onclickListener就是观察者,而onclickAction就对应着观察者中对事件进行响应的update方法。

JDK中观察者模式的应用:

java.util.Observer
java.util.Observable
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener

转载于:https://my.oschina.net/hongdengyan/blog/196147

你可能感兴趣的文章
spring jpa 配置详解
查看>>
IOE,为什么去IOE?
查看>>
Storm中的Worker
查看>>
dangdang.ddframe.job中页面修改表达式后进行检查
查看>>
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>
SpringBoot 整合Redis
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>