`
zhangwei_david
  • 浏览: 468912 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 设计模式-观察者(Observer )

阅读更多

     观察者模式(Observer Pattern)的意图是在多个对象之间定义一对多的依赖关系,当一个对象的状态改变时,会通知依赖于他的对象,并根据状态做出想用的反应。

      观察者模式(Observer Pattern)涉及的角色有:

  1. 抽象主题(Abstract Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色
  2. 具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。
  3. 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
  4. 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。

观察者在java.util中提供了观察者模式的支持。

        现在对商品的价格和库存做一个监控,当商品的价格和库存的小于阀值时向用户发送提醒消息。

/**
 *
 * @author zhangwei_david
 * @version $Id: MonitorState.java, v 0.1 2014年11月24日 下午3:18:09 zhangwei_david Exp $
 */
public class Product extends Observable {
    private final int id    = 102;
    private double    price = 100.00;
    private int       stock = 100;

    /**
     * Getter method for property <tt>price</tt>.
     *
     * @return property value of price
     */
    public double getPrice() {
        return price;
    }

    /**
     * Getter method for property <tt>stock</tt>.
     *
     * @return property value of stock
     */
    public int getStock() {
        return stock;
    }

    /**
     * Setter method for property <tt>price</tt>.
     *
     * @param price value to be assigned to property price
     */
    public void setPrice(double price) {
        this.price = price;
        sendNotify(price);
    }

    /**
     * Setter method for property <tt>stock</tt>.
     *
     * @param stock value to be assigned to property stock
     */
    public void setStock(int stock) {
        this.stock = stock;
        sendNotify(stock);
    }

    /**
     * Getter method for property <tt>id</tt>.
     *
     * @return property value of id
     */
    public int getId() {
        return id;
    }

    /**
     * 发送通知
     */
    private void sendNotify(Object obj) {
        setChanged();
        notifyObservers(obj);
    }

}

 

/**
 *商品库存的观察者
 * @author zhangwei_david
 * @version $Id: DelayMonitor.java, v 0.1 2014年11月24日 下午3:31:41 zhangwei_david Exp $
 */
public class PriceObserver implements Observer {

    /**
     * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
     */
    public void update(Observable observable, Object arg) {

        if (observable instanceof Product && arg instanceof Double) {
            Product product = (Product) observable;
            System.out.println("您 购物车中的商品价格有新的变化 当前价格是 " + product.getPrice() + " 元");
        }
    }

    /**
     *
     * @param monitorState
     */
    public void register(Observable observable) {
        observable.addObserver(this);
    }

}

 

/**
 *商品库存的观察者
 * @author zhangwei_david
 * @version $Id: DelayMonitor.java, v 0.1 2014年11月24日 下午3:31:41 zhangwei_david Exp $
 */
public class StockObserver implements Observer {

    /**
     * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
     */
    public void update(Observable observable, Object arg) {
        if (observable instanceof Product && arg instanceof Integer) {
            Product product = (Product) observable;
            if (product.getStock() < 5) {
                System.out.println("您 购物车中的商品 库存紧张,剩余 " + product.getStock() + " 件");
            }
        }
    }

    /**
     *
     * @param monitorState
     */
    public void register(Observable observable) {
        observable.addObserver(this);
    }

}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: Client.java, v 0.1 2014年11月24日 下午3:26:58 zhangwei_david Exp $
 */
public class Client {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        Product monitorState = new Product();
        new StockObserver().register(monitorState);
        monitorState.setPrice(100);
        monitorState.setStock(1);

        new PriceObserver().register(monitorState);
        monitorState.setPrice(99);
        monitorState.setPrice(98);
        monitorState.setPrice(97);
    }
}

 

您 购物车中的商品 库存紧张,剩余 1 件
您 购物车中的商品价格有新的变化 当前价格是 99.0 元
您 购物车中的商品价格有新的变化 当前价格是 98.0 元
您 购物车中的商品价格有新的变化 当前价格是 97.0 元

 商品的库存和价格的变化可以实时地反馈到两个观察者对象。

 

0
0
分享到:
评论
1 楼 jackra 2014-11-24  
不好.一个东西又放值,又控制,太容易混淆概念.
不适合作为学习的代码.

相关推荐

    Java 设计模式-观察者模式(Observer)

    结合微信公众号讲解观察者模式,生动形象,关键是上手快啊

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

    设计模式 观察者 发布/订阅 Observer

    Observer (观察者模式) 又叫做发布/订阅(Publish/Subscribe)模式。 当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响...

    Java 观察者模式的浅析

    Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...

    设计模式之Observer - 观察者模式

    NULL 博文链接:https://lgd-java2eye.iteye.com/blog/760350

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

    Java设计模式之观察者模式(Observer模式)介绍

    主要介绍了Java设计模式之观察者模式(Observer模式)介绍,Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解,需要的朋友可以...

    java观察者模式demo----未使用java工具类

    观察者设计模式,java语言实现,完全自己代码实现,未使用observable和observer

    java版本二十三种设计模式.zip

    - 观察者模式(Observer) - 模板方法模式(Template Method) - 策略模式(Strategy) - 责任链模式(Chain of Responsibility) - 中介者模式(Mediator) - 访问者模式(Visitor) - 命令模式(Command) - 解释器模式...

    Java内置观察者模式

    观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式

    [行为模式]head first 设计模式之观察者模式(observer)

    NULL 博文链接:https://jacky-dai.iteye.com/blog/1132063

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    23种设计模式的java源代码

    里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些代码对于初学者看起来稍微复杂一些,我...

    33种JAVA设计模式DEMO

    观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第9章 观察者(observer)模式 72 第10章 调停者(mediator)模式 85 第11章 代理(proxy)模式 97 第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 ...

    详解Java编程的Observer观察者设计模式

    主要介绍了Java编程的Observer观察者设计模式,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象,需要的朋友可以参考下

    java观察者模式.doc

    在设计一组依赖的对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer Pattern)很有用。它可以使依赖对象的状态与它们所依赖的对象的状态保持同步。这组依赖的对象指的是观察者(Observer)...

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...

    23种设计模式的java源代码----容易理解的源代码

    里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些设计模式源代码更容易理解

    观察者模式(Observer)原理图

    观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...

Global site tag (gtag.js) - Google Analytics