`

观察者模式( 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为例写的观察者模式的应用举例。有需要的同学请下载!

    Obsever test

    在IT行业中,观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...

    matlab开发-Observerpattern

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的对象。在MATLAB中实现观察者模式,可以帮助我们构建灵活、可扩展的代码结构,特别是在...

    obsever_chua_观测器_

    `obsever_chua.mdl`文件很可能是一个已经搭建好的Simulink模型,其中包含了Chua电路的建模以及观测器的设计。用户可以通过这个模型来观察和分析Chua系统在不同条件下的行为,并验证观测器对系统状态估计的准确性。 ...

    蔡氏系统中基于观察者的同步:蔡氏系统中基于观察者同步的Simulink模型-matlab开发

    而"基于观察者的同步"则涉及控制理论中的状态估计,用于获取系统不可直接测量的状态信息。在本场景中,我们将讨论如何在MATLAB的Simulink环境中构建蔡氏系统的观测器同步模型。 **蔡氏系统** 蔡氏系统由Leon Chua...

    observer 网络管理工具

    Observer是一款强大的网络管理工具,专为IT专业人员设计,提供了全面的监控、认证和日志记录功能,确保企业级服务器的安全和稳定运行。这个工具的关键特性在于它的索引型可视化数据库,可以精确地记录和回放服务器上...

    STM32 MC FOC SDK

    STM32 MC FOC SDK 是一个专为STM32微控制器设计的磁场定向控制(Field Oriented Control,简称FOC)软件开发套件。这个SDK主要用于帮助开发者在STM32平台上实现高性能的电机控制,特别是在需要高精度和高效能的应用...

    STM32FOC电机控制角度速度计算源代码MC_State_Observer

    STM32FOC电机控制角度速度计算源代码MC_State_Observer

    MC_State_Observer.rar_MC_State_Observer_MC_State_Observer.c_obse

    意法半导体公司关于电机控制器的源代码程序,此为其中的观测器源代码

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

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

    滑模相关(是一个大文件夹) 1.永磁电机的滑模观测器Simulink模型 2.永磁同步电机趋近律滑膜控制NSMC 3.MATLA

    11.无刷滑膜Slide Mode Obsever 12.永磁同步电机smo滑膜观测算法带文档 13.永磁同步电机滑模控制Simulink仿真模型 14.永磁同步电机滑膜变结构无速度传感器控制Simulink仿真模型 15.永磁同步直线电机PMLSM矢量控制...

Global site tag (gtag.js) - Google Analytics