`
步行者
  • 浏览: 167611 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java 中的 Observer

阅读更多

 

Java 中的 Observer

Java 提供了 Observer 模式的默认实现,下面我们就看一下 Java 对 观察者模式的支持。

Java 对 观察者模式的支持 主要体现在 Observable  类和 Observer 接口。


(1) Observable  类代表 被观察者 (java.util.Observable

        主要方法有:

        void setChanged() : 设置被观察者的状态已经被改变
       
void addObserver(Observer  observer) : 添加观察者
       
int countObservers() : 返回所有观察者的数目
       
void deleteObserver(Observer  observer) :删除指定观察者
       
void deleteObservers() : 删除所有观察者
       
boolean hasChanged() : 被观察者的状态是否被改变,如果是则返回true,否则返回false
       
void notifyObservers()  : 通知所有观察者(没有参数)

        void notifyObservers(Object arg) : 通知所有观察者(带参数,参数一般设定为被改变的属性)
       
void clearChanged() :清除被观察者状态的改变(即调用 hasChanged() 时会返回 false)

(2) Observer 接口代表 观察者 (java.util.Observer

        它只有一个抽象方法需要被具体的观察者类实现(很重要 ):

        void update(Observable observable, Object arg) :当 被观察者 调用 notifyObservers(*) 方法

时,会根据被观察者的 hasChanged() 方法 来判断 它的状态是否被改变, 如果被观察者的状态被改变了,则

会调用 观察者 的 update 方法,参数 observable 为 被观察者对象, arg 为调用 notifyObservers( Object arg ) 时传入的参数 arg ,如果调用的是 notifyObservers() 方法, arg 为 null( 注意 :应该把这个参数 arg 设定为 被观察者的 被改变的属性)。


下面是一个实例:

被观察者 是 一个商品,当它的价格被改变后,就会通知相应的关注此商品的 客户(观察者)。


1,Good 类:商品类,继承了 Observable 类。


class Good extends Observable{
	private String name;
	private float price;
	public Good(String name, float price) {
		this.name = name;
		this.price = price;
	}
	public String getName() {
		return name;
	}
	public float getPrice() {
		this.notifyObservers(price);
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
		/*
		 * 注意 :在通知 所有观察者之前
		 * 一定要调用 setChanged()方法来设置被观察者的状态已经被改变,
		 */
		this.setChanged();
		/*
		 * notifyObservers 方法在通知完所有吗 观察者 后,
		 * 会自动调用 clearChanged 方法来清除 被观察者 的状态改变。
		 */
		this.notifyObservers(price);
	}
}
 

 

2,Customer 类:客户类,实现了 Observer 接口。


public class Customer implements Observer{
	private String name;
	public Customer(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void update(Observable observable, Object arg) {
		if(observable instanceof Good && arg instanceof Float){
			System.out.println("客户<"+this.name+"> : "+((Good)observable).getName()+"的价格变了,"+arg+"元了 !");
		}
	}
}

 

3,Test 测试类:

 

public class Test {
	public static void main(String[] args){
		Good good = new Good("洗衣粉",3.5f);
		Customer tom = new Customer("Tom");
		Customer jerry = new Customer("Jerry");
		good.addObserver(tom);
		good.addObserver(jerry);
		
		good.setPrice(2.5f);
		good.setPrice(3.0f);
	}
}
 

 

运行 Test 类,输出如下:

 

客户<Jerry> : 洗衣粉的价格变了,2.5元了 !
客户<Tom> : 洗衣粉的价格变了,2.5元了 !
客户<Jerry> : 洗衣粉的价格变了,3.0元了 !
客户<Tom> : 洗衣粉的价格变了,3.0元了 !


分享到:
评论

相关推荐

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

    该示例是翻写一老外Observer Pattern的例子,本人觉得该示例是对该模式的非常精典的说明,于是花点功夫来翻写它,因为他的代码没有注释说明该模式的设计思想怎样体现在代码中去,所以,本人结合代码注释了关键代码的...

    ObserverPattern

    设计模式之观察者模式ObserverPattern

    java设计模式之Observer参考.pdf

    java设计模式之Observer参考.pdf

    MVC小例子 使用Java类库observer和Observable

    这是最简单的一个MVC实例,通过它你可以了解MVC的基本工作原理。

    java设计模式之Observer[整理].pdf

    java设计模式之Observer[整理].pdf

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

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

    java实现观察者模式-Java内置的观察者模式(基于Observable和Observer)

    Java内置的Observable类和Observer接口提供了基本的观察者模式功能,你可以通过继承Observable类和实现Observer接口来使用

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

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

    observer_JavaDesignPattern_

    观察者模式,实现了表示层和数据逻辑的分离。在观察目标和观察者之间建立一个抽象的耦合

    observer:Java的观察者实现

    在浏览器和节点环境中工作,支持AMD模块定义和RequireJS(因此, Observer对象作为模块公开)。 这个模块是为我自己的使用而创建的,但是我决定共享它。 为什么还要再实施 这样的模块已经有很多实现,例如良好的 ...

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

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

    java观察者模式介绍

    JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标...

    美团Java 岗 154 道面试题.zip

    100.在 Java 中,什么叫观察者设计模式(observer design pattern)? 101.使用工厂模式最主要的好处是什么?在哪里使用? 102.举一个用 Java 实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类...

    Observer模式的应用

    股票的价格随着时间会在一定范围内波动,对于每个股票,股票分析软件提供多种指标分析,如分时图,K线图等,以辅助投资者进行... 提示:股价变动用随机数模拟:java.util.Random,用一个线程模拟股票行情数据的产生。

    OBserver模式设计实现

    Head First模式设计用的是Java,实现观察者模式使用C++

    JAVA 设计模式PPT

    首先介绍了Java中面向对象特性和技术,逐个分析Abstract Factory;Builder;Prototype;Singleton;Adapter (对象);Bridge;Composite;Decorator;Facade;Flyweight;Proxy;Iterator;Observer等模式

    HBaseObserver:通过HBase Observer同步数据到ElasticSearch

    测试环境CDH 5.1.0HBase 0.98ElasticSearch 1.5.0使用Maven打包mvn clean compile assembly:single部署请参照:

    Java实现MVC球体

    import java.util.Observer; import java.util.Observable; import java.text.NumberFormat; import javax.swing.*; import Controller.TextController; import Model.Sphere; import java.awt.*; import java....

    JAVA设计模式之行为模式

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

    观察者模式Observer

    观察者模式Observer: 以手机号码为例,老师的手机号码存在学生的手机里,若老师的手机号改变,她会发一条短信通知每个学生自己手机号变了

Global site tag (gtag.js) - Google Analytics