zoukankan      html  css  js  c++  java
  • Java观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解。设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Observer(观察者)模式是比较常用的一个模式,尤其在界面设计中应用广泛,而本教程所关注的是Java在电子商务系统中应用,因此想从电子商务实例中分析Observer的应用。

    虽然网上商店形式多样,每个站点有自己的特色,但也有其一般的共性,单就"商品的变化,以便及时通知订户"这一点,是很多网上商店共有的模式,这一模式类似Observer patern。

    具体的说,如果网上商店中商品在名称 价格等方面有变化,如果系统能自动通知会员,将是网上商店区别传统商店的一大特色。这就需要在商品product中加入Observer这样角色,以便product细节发生变化时,Observer能自动观察到这种变化,并能进行及时的update或notify动作。

    Java观察者模式


    Java的API还为为我们提供现成的Observer接口Java.util.Observer。我们只要直接使用它就可以。

    我们必须extends Java.util.Observer才能真正使用它:

    • 提供Add/Delete observer的方法;
    • 提供通知(notisfy) 所有observer的方法。
    复制代码
     1 //产品类 可供Jsp直接使用UseBean调用 该类主要执行产品数据库插入 更新
     2 public class product extends Observable{
     3   private String name;
     4   private float price;
     5   public String getName(){ return name;}
     6   public void setName(){
     7           this.name=name;
     8           //设置变化点
     9           setChanged();
    10           notifyObservers(name);
    11   }   
    12   public float getPrice(){ return price;}
    13   public void setPrice(){
    14           this.price=price;
    15           //设置变化点
    16           setChanged();
    17           notifyObservers(new Float(price));
    18   }
    19   //以下可以是数据库更新 插入命令.
    20   public void saveToDb(){
    21           .....................
    22         }
    23 }
    复制代码

    我们注意到,在product类中 的setXXX方法中,我们设置了 notify(通知)方法,当Jsp表单调用setXXX,实际上就触发了notisfyObservers方法,这将通知相应观察者应该采取行动了。

    下面看看这些观察者的代码,他们究竟采取了什么行动:

    复制代码
     1 //观察者NameObserver主要用来对产品名称(name)进行观察的
     2 public class NameObserver implements Observer{
     3   private String name=null;
     4   public void update(Observable obj,Object arg){
     5     if (arg instanceof String){
     6      name=(String)arg;
     7      //产品名称改变值在name中
     8      System.out.println("NameObserver :name changet to "+name);
     9     }
    10   }
    11 }
    12 
    13 //观察者PriceObserver主要用来对产品价格(price)进行观察的
    14 public class PriceObserver implements Observer{
    15   private float price=0;
    16   public void update(Observable obj,Object arg){
    17     if (arg instanceof Float){
    18      price=((Float)arg).floatValue();
    19      System.out.println("PriceObserver :price changet to "+price);
    20     }
    21   }
    22 }
    复制代码

    Jsp中我们可以来正式执行这段观察者程序:

    复制代码
     1 <jsp:useBean id="product" scope="session" class="Product" />
     2 <jsp:setProperty name="product" property="*" />
     3 
     4 <jsp:useBean id="nameobs" scope="session" class="NameObserver" />
     5 <jsp:setProperty name="product" property="*" />
     6 
     7 <jsp:useBean id="priceobs" scope="session" class="PriceObserver" />
     8 <jsp:setProperty name="product" property="*" />
     9 
    10 <%
    11 if (request.getParameter("save")!=null)
    12 {
    13   product.saveToDb();
    14   out.println("产品数据变动 保存! 并已经自动通知客户");
    15 }else{
    16   //加入观察者
    17   product.addObserver(nameobs);
    18   product.addObserver(priceobs);
    19 %>
    20   //request.getRequestURI()是产生本jsp的程序名,就是自己调用自己
    21   <form action="<%=request.getRequestURI()%>" method=post>
    22   <input type=hidden name="save" value="1">
    23   产品名称:<input type=text name="name" >
    24   产品价格:<input type=text name="price">
    25   <input type=submit>
    26   </form>
    27 <%
    28 }
    29 %>
    复制代码

    执行改Jsp程序,会出现一个表单录入界面,需要输入产品名称 产品价格,点按Submit后,还是执行该jsp的if (request.getParameter("save")!=null)之间的代码。


    由于这里使用了数据javabeans的自动赋值概念,实际程序自动执行了setName setPrice语句。你会在服务器控制台中发现下面信息:
    1     NameObserver :name changet to ?????(Jsp表单中输入的产品名称)
    2     PriceObserver :price changet to ???(Jsp表单中输入的产品价格);

    这说明观察者已经在行动了。


    同时你会在执行jsp的浏览器端得到信息:
        产品数据变动 保存! 并已经自动通知客户

    上文由于使用jsp概念,隐含很多自动动作,现将调用观察者的Java代码写如下:
    复制代码
     1 public class Test {
     2   public static void main(String args[]){
     3     Product product=new Product();
     4     NameObserver nameobs=new NameObserver();
     5     PriceObserver priceobs=new PriceObserver();
     6 
     7     //加入观察者
     8     product.addObserver(nameobs);
     9     product.addObserver(priceobs);
    10 
    11     product.setName("橘子红了");
    12     product.setPrice(9.22f);
    13   }
    14 }
    复制代码

    你会在发现下面信息:

        NameObserver :name changet to 橘子红了
        PriceObserver :price changet to 9.22

    这说明观察者在行动了。
  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/AutumnRhyme/p/4316234.html
Copyright © 2011-2022 走看看