`

观察者模式( Obsever Pattern)

阅读更多

观察者模式的应用场景:

在有些场景,比如多个类可能需要依赖一个类,比如价格,如果产品价格发生变化,那么依赖他的类也需要拍做出相应的变化或者更新。那么这些依赖产品的类就是观察者,产品就是被观察者抑或主题对象。

/**
 * 这是一个观察者接口,如果要作为一个观察者对象
 * 需要实现该接口,这个接口一般定义一些公共的且
 * 需要操作主题对象的方法
 * @author nickyzhang
 */
public interface Observer {
  //Observable 代表了主体对象 ,因为你需要更新什么对象,我们需要知道
  //什么东西变化我们才需要更新
  public abstract void update(Observable obs, Object obj);
}

 

package com.aaxis.pattern.observer;

import java.util.ArrayList;
import java.util.List;

public abstract class Observable {
  //保存绑定该主体对象的监听器
  List<Observer> listenerList  = new ArrayList<Observer>();
  //注册观察者
  public void registerObserver(Observer o){
    listenerList.add(o);
  }
  //删除观察者
  public void removeObserver(Observer o){
    listenerList.remove(o);
  }
  //什么属性变化通知注册的所有观察者
  public void notifyAllObserver(Object value){
    //遍历每一个观察者,并且根据变化的值进行更新
    for(Observer o : listenerList){
      o.update(this, value);
    }
  }
}

 

/**主题对象==被观察者*/
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;
  }
  public void setName(String name) {
    this.name = name;
    //当有程序调用Product的setName时自动通知观察者
    notifyAllObserver(name);
  }
  public double getPrice() {
    return price;
  }
  public void setPrice(double price) {
    this.price = price;
    notifyAllObserver(price);
  }
  
}

 

//两个观察者

public class NameObserver implements Observer {
 public void update(Observable obs, Object obj) {
   if(obj instanceof String){
     System.out.println("姓名观察者:"+obs+"名称以变为"+obj);
   }
 }
}

 

public class PriceObserver implements Observer{
  public void update(Observable obs, Object obj) {
    if(obj instanceof Double) {
      System.out.println("价格观察者:"+obs +"价格改变为:"+obj);
    }
  }
}

 

public class ObserverTest {
  public static void main(String[] args) {
    Product product = new Product("Guiatr",4568.23);
    NameObserver nameObserver = new NameObserver();
    PriceObserver priceObserver = new PriceObserver();
    product.registerObserver(nameObserver);
    product.registerObserver(priceObserver);
    
    product.setName("Bass");
    product.setPrice(3456.12);
  }
}

分享到:
评论

相关推荐

    ObserverPattern.unitypackage

    ObserverPattern.unitypackage是一个以unity为例写的观察者模式的应用举例。有需要的同学请下载!

    matlab开发-Observerpattern

    matlab开发-Observerpattern。观察者模式示例

    Obsever test

    使用Obsever技术更改即时通信人状态

    obsever_chua_观测器_

    chua 系统基于观测器同步的matlab/Simulink模型

    observer 网络管理工具

    observer网络管理工具 功能最强和最多样化的平台,能够监测,认证和记录企业级服务器的所有用户的一切行为,其便于检索的索引型可视化数据库能够将被监视服务器上的运行状况进行准确回放.

    STM32 MC FOC SDK

    STM32F MC FOC SDK Soruce STM32F MC FOC SDK Soruce

    Vue Object.defineProperty及ProxyVue实现双向数据绑定

    双向数据绑定无非就是... 实现视图层的更新:订阅者模式,定义个 Watcher 函数实现对DOM的更新(Watcher) 将数据和视图层进行绑定,解析指令v-bind、v-model、v-click(myVue.prototype._compile) 创建Vue实例(new myV

Global site tag (gtag.js) - Google Analytics