zoukankan      html  css  js  c++  java
  • java中观察者模式Observable和Observer

    如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口

    观察者设计模式

    现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房者都可以观察得到。

    实际上以上的购房者就是观察者,他们所关注的房价就是被观察者

    其中要求,被观察者需要继承Observable类,观察则需要实现Observer接口

    具体实现如下

    房价的实现

    复制代码
     1 class House extends Observable{
     2     private double price;
     3     public House(double price){
     4         this.price=price;
     5     }
     6     public double getPrice(){
     7         return price;
     8     }
     9     public void setPrice(double price){
    10         if(this.price!=price){
    11             this.price=price;
    12             setChanged();  //标注价格已经被更改
    13             this.notifyObservers(price);  //通知观察者数据已被更改
    14         }
    15     }
    16     @Override
    17     public String toString() {
    18         return "当前房价为:"+price;
    19     }
    20 }
    复制代码

    购房者实现

    复制代码
     1 class HousePriceObserver implements Observer{
     2     private String name;
     3     public  HousePriceObserver(String name) {
     4         this.name=name;
     5     }
     6     @Override
     7     public void update(Observable o, Object arg) {
     8         //这里最好判断一下通知是否来自于房价,有可能来自其它地方
     9         if(o instanceof House){
    10             System.out.println("购物者"+name+ "观察到房价已调整为:"+arg);
    11         }
    12     }
    13 }
    复制代码

    运行

    复制代码
     1 House house=new House(10000);
     2 HousePriceObserver A=new HousePriceObserver("A");
     3 HousePriceObserver B=new HousePriceObserver("B");
     4 HousePriceObserver C=new HousePriceObserver("C");
     5 house.addObserver(A);
     6 house.addObserver(B);
     7 house.addObserver(C);
     8 System.out.println(house);
     9 house.setPrice(6000);
    10 house.setPrice(8000);
    复制代码

    运行结果为:

    当前房价为:10000.0
    购物者C观察到房价已调整为:6000.0
    购物者B观察到房价已调整为:6000.0
    购物者A观察到房价已调整为:6000.0
    购物者C观察到房价已调整为:8000.0
    购物者B观察到房价已调整为:8000.0
    购物者A观察到房价已调整为:8000.0

  • 相关阅读:
    Openstack API 开发 快速入门
    virtualBox虚拟机到vmware虚拟机转换
    使用Blogilo 发布博客到cnblogs
    Openstack Troubleshooting
    hdoj 1051 Wooden Sticks(上升子序列个数问题)
    sdut 2430 pillars (dp)
    hdoj 1058 Humble Numbers(dp)
    uva 10815 Andy's First Dictionary(快排、字符串)
    sdut 2317 Homogeneous squares
    hdoj 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列+二分)
  • 原文地址:https://www.cnblogs.com/fan-yuan/p/7988931.html
Copyright © 2011-2022 走看看