设计模式--观察者模式[Observer]
2014-07-08 16:11
316 查看
本文地址:/article/5432379.html
转载请在明显位置标明出处
View Code
分析下源码你就会发现实现其实原理很简单
java.util.Observable中定义了一个集合用来封装观察者.
当被观察者发生变化时我们就迭代这个集合调用都有的观察者方法(update)
其实也可以在被观察者的set方法中调用.
我们必须extends Java.util.Observer才能真正使用它:
1.提供Add/Delete
observer的方法;
2.提供通知(notisfy) 所有observer的方法;
我们注意到,在product类中 的setXXX方法中,我们设置了 notify(通知)方法, 当Jsp表单调用setXXX(如何调用见我的另外一篇文章),实际上就触发了notisfyObservers方法,这将通知相应观察者应该采取行动了.
下面看看这些观察者的代码,他们究竟采取了什么行动:
执行改Jsp程序,会出现一个表单录入界面, 需要输入产品名称 产品价格, 点按Submit后,还是执行该jsp的 if (request.getParameter("save")!=null)之间的代码.
由于这里使用了数据javabeans的自动赋值概念,实际程序自动执行了setName setPrice语句.你会在服务器控制台中发现下面信息:: NameObserver :name changet to ?????(Jsp表单中输入的产品名称)
PriceObserver :price changet to ???(Jsp表单中输入的产品价格);
这说明观察者已经在行动了.!! 同时你会在执行jsp的浏览器端得到信息:
产品数据变动 保存! 并已经自动通知客户
上文由于使用jsp概念,隐含很多自动动作,现将调用观察者的Java代码写如下:
你会在发现下面信息:: NameObserver :name changet to 橘子红了
PriceObserver :price changet to 9.22
这说明观察者在行动了.!!
缺点,无法按照指定的顺序通知观察者,因为父类中是Vector 迭代时是从添加顺序反向迭代的(详细的请看源码)
有特殊需求时可以自己实现观察者模式
转载请在明显位置标明出处
/* * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package java.util; /** * A class can implement the <code>Observer</code> interface when it * wants to be informed of changes in observable objects. * * @author Chris Warth * @see java.util.Observable * @since JDK1.0 */ public interface Observer { /** * This method is called whenever the observed object is changed. An * application calls an <tt>Observable</tt> object's * <code>notifyObservers</code> method to have all the object's * observers notified of the change. * * @param o the observable object. * @param arg an argument passed to the <code>notifyObservers</code> * method. */ void update(Observable o, Object arg); }
View Code
分析下源码你就会发现实现其实原理很简单
java.util.Observable中定义了一个集合用来封装观察者.
当被观察者发生变化时我们就迭代这个集合调用都有的观察者方法(update)
其实也可以在被观察者的set方法中调用.
我们必须extends Java.util.Observer才能真正使用它:
1.提供Add/Delete
observer的方法;
2.提供通知(notisfy) 所有observer的方法;
//产品类 可供Jsp直接使用UseBean调用 该类主要执行产品数据库插入 更新 public class product extends Observable{ private String name; private float price; public String getName(){ return name;} public void setName(){ this.name=name; //设置变化点 setChanged(); notifyObservers(name); } public float getPrice(){ return price;} public void setPrice(){ this.price=price; //设置变化点 setChanged(); notifyObservers(new Float(price)); } //以下可以是数据库更新 插入命令. public void saveToDb(){ ..................... }
我们注意到,在product类中 的setXXX方法中,我们设置了 notify(通知)方法, 当Jsp表单调用setXXX(如何调用见我的另外一篇文章),实际上就触发了notisfyObservers方法,这将通知相应观察者应该采取行动了.
下面看看这些观察者的代码,他们究竟采取了什么行动:
//观察者NameObserver主要用来对产品名称(name)进行观察的 public class NameObserver implements Observer{ private String name=null; public void update(Observable obj,Object arg){ if (arg instanceof String){ name=(String)arg; //产品名称改变值在name中 System.out.println("NameObserver :name changet to "+name); } } } //观察者PriceObserver主要用来对产品价格(price)进行观察的 public class PriceObserver implements Observer{ private float price=0; public void update(Observable obj,Object arg){ if (arg instanceof Float){ price=((Float)arg).floatValue(); System.out.println("PriceObserver :price changet to "+price); } } }
<jsp:useBean id="product" scope="session" class="Product" /> <jsp:setProperty name="product" property="*" /> <jsp:useBean id="nameobs" scope="session" class="NameObserver" /> <jsp:setProperty name="product" property="*" /> <jsp:useBean id="priceobs" scope="session" class="PriceObserver" /> <jsp:setProperty name="product" property="*" /> <% if (request.getParameter("save")!=null) { product.saveToDb(); out.println("产品数据变动 保存! 并已经自动通知客户"); }else{ //加入观察者 product.addObserver(nameobs); product.addObserver(priceobs); %> //request.getRequestURI()是产生本jsp的程序名,就是自己调用自己 <form action="<%=request.getRequestURI()%>" method=post> <input type=hidden name="save" value="1"> 产品名称:<input type=text name="name" > 产品价格:<input type=text name="price"> <input type=submit> </form> <% } %>
执行改Jsp程序,会出现一个表单录入界面, 需要输入产品名称 产品价格, 点按Submit后,还是执行该jsp的 if (request.getParameter("save")!=null)之间的代码.
由于这里使用了数据javabeans的自动赋值概念,实际程序自动执行了setName setPrice语句.你会在服务器控制台中发现下面信息:: NameObserver :name changet to ?????(Jsp表单中输入的产品名称)
PriceObserver :price changet to ???(Jsp表单中输入的产品价格);
这说明观察者已经在行动了.!! 同时你会在执行jsp的浏览器端得到信息:
产品数据变动 保存! 并已经自动通知客户
上文由于使用jsp概念,隐含很多自动动作,现将调用观察者的Java代码写如下:
public class Test { public static void main(String args[]){ Product product=new Product(); NameObserver nameobs=new NameObserver(); PriceObserver priceobs=new PriceObserver(); //加入观察者 product.addObserver(nameobs); product.addObserver(priceobs); product.setName("橘子红了"); product.setPrice(9.22f); } }
你会在发现下面信息:: NameObserver :name changet to 橘子红了
PriceObserver :price changet to 9.22
这说明观察者在行动了.!!
缺点,无法按照指定的顺序通知观察者,因为父类中是Vector 迭代时是从添加顺序反向迭代的(详细的请看源码)
有特殊需求时可以自己实现观察者模式
相关文章推荐
- 设计模式之观察者模式(Observer Pattern)(一)
- Java设计模式之Observer(观察者)模式
- java设计模式学习系列之六:Observer, 观察者模式---小例
- 设计模式笔记--行为型模式之七Observer--观察者
- 设计模式笔记 18. Observer 观察者模式(行为型模式)
- IssueVision 学习笔记(三)-----设计模式之OBSERVER(观察者)模式
- 设计模式学习2——观察者模式(Observer)
- 我读设计模式之观察者模式(Observer Pattern)
- 设计模式之观察者(Observer)模式与其C++通用实现(上)
- 设计模式理解 - 伟大的【Observer 观察者模式】
- C#设计模式-观察者observer模式实现
- .NET实用设计模式:观察者模式(Observer)
- 设计模式与泡mm的关系之Observer观察者模式及再思考
- 设计模式之Observer(观察者)
- 设计模式之观察者模式(Observer Pattern)(二)
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 设计模式之观察者Observer
- 观察者设计模式Observer
- 设计模式之Observer观察者模式