学习笔记-轻量级Java EE:模式--观察者模式
来源:互联网 发布:comway 无线串口软件 编辑:程序博客网 时间:2024/06/05 15:58
观察者模式定义了对象间一对多依赖关系,让一个或多个观察者对象观察一个主题对象;当主题对象的状态发生改变时,系统能通知所有依赖于此对象的观察者对象,从而使观察者对象能够自动更新。
在观察者模式中,被观察的对象常常被称为目标或者主题(Subject),依赖的对象被称为观察者(Observer)。
例子:
1.先提供一个观察者接口:(JDK 已提供,可直接使用java.util.Observer,如不符合条件,则自行设计)
所有的观察者都应该实现该接口,其中update方法中的Observable参数代表被观察对象。
public interface Observer{void update(Observable o , Object arg);}2.接着提供一个Observable抽象基类,此类是被观察对象应该继承的对象(JDK已提供,可直接使用java.util.Observable,如不符合条件,则自行设计)
public abstract class Observable{// 用一个List来保存该对象上所有绑定的事件监听器List<Observer> observers = new ArrayList<Observer>();//定义一个方法,用于从该主题上注册观察者public void registObserver(Observer o){observers.add(o);}//定义一个方法,用于从该主题中删除观察者public void removeObserver(Observer o){observers.remove(o);}//通知该主题上注册的所有观察者public void notifyObservers(Object value){//遍历注册到该被观察者上的所有观察者for (Iterator it = observers.iterator(); it.hasNext(); ){Observer o = (Observer)it.next();//显式每个观察者的update方法o.update(this , value);}}}3.提供一个被观察者类:Product,继承了Observable基类
public class Product extends Observable{//定义两个属性private String name;private double price;//无参数的构造器public Product(){}public Product(String name , double price){this.name = name;this.price = price;}public String getName(){return name;}//当程序调用name的setter方法来修改Product的name属性时//程序自然触发该对象上注册的所有观察者public void setName(String name){this.name = name;notifyObservers(name);}public double getPrice(){return price;}//当程序调用price的setter方法来修改Product的price属性时//程序自然触发该对象上注册的所有观察者public void setPrice(double price){this.price = price;notifyObservers(price);}}4.编写俩个观察者对象:继承基类Observer
public class NameObserver implements Observer{//实现观察者必须实现的update方法public void update(Observable o , Object arg){if (arg instanceof String ){//产品名称改变值在name中String name = (String)arg;System.out.println("名称观察者:" +o + "物品名称已经改变为: " + name);}}}
public class PriceObserver implements Observer{//实现观察者必须实现的update方法public void update(Observable o , Object arg){if(arg instanceof Double){System.out.println("价格观察者:" +o + "物品价格已经改变为: " + arg);}}}5.编写一个测试程序:
public class Test{public static void main(String[] args) {//创建一个被观察者对象Product p = new Product("电视机" , 176);//创建两个观察者对象NameObserver no = new NameObserver();PriceObserver po = new PriceObserver();//向被观察对象上注册两个观察者对象p.registObserver(no);p.registObserver(po);//程序调用setter方法来改变Product的name和price属性p.setName("书桌");p.setPrice(345f);}}当调用Product对象的set方法时,观察者对象都会被触发;
如果学习过或者使用过java事件机制的底层实现,采用的是观察者模式;
另外在java EE中也有使用,例如主题/订阅模式下的JMS(java message service,java消息服务),本身就是观察者模式的应用,如下示例图:
0 0
- 学习笔记-轻量级Java EE:模式--观察者模式
- 学习笔记-轻量级Java EE:模式--单例模式
- 学习笔记-轻量级Java EE:模式--命令模式
- 学习笔记-轻量级Java EE:模式--策略模式
- 学习笔记-轻量级Java EE:模式--门面模式
- 学习笔记-轻量级Java EE:模式--桥接模式
- 学习笔记-轻量级Java EE:模式--简单工厂
- 学习笔记-轻量级Java EE:模式--工厂方法和抽象工厂
- java观察者模式学习笔记
- java设计模式学习笔记--观察者模式
- 学习笔记-轻量级Java EE:JSP基本知识
- 学习笔记-轻量级Java EE:Servlet基础
- 观察者模式学习笔记
- 观察者模式学习笔记
- Java学习笔记之观察者模式
- java 设计模式学习笔记(12) - 观察者模式
- java设计模式学习笔记6 观察者模式
- Java学习笔记(十)观察者模式及适配器模式
- 在win7\win8.1 x64系统中安装SQL Express时出现29506错误码的解决方案
- poj-3277-City Horizon-离散化+线段树区域更新
- DirectFB 之 实例图像不断右移
- 学习PyQt (1)
- memcached详解
- 学习笔记-轻量级Java EE:模式--观察者模式
- 深入理解WeakHashmap
- MTK LCD白屏解决方案
- 什么情况下使用自定义拷贝构造函数
- BC4J
- java程序会发生内存泄露的问题吗
- UITableView基本用法
- android命令
- IOS 图片资源 @2x.png