Observable观察者模式

Observable观察者模式个人理解


目录

观察者模式:

又称发布订阅模式(似乎两者之间有一些差别),对象的行为模式,它定义了一种一对多的依赖关系,即多个【观察者】监视一个【被观察者】,当【被观察者】发生状态改变的时候,通知所有【观察者】并使其做出相应的反应。
比如函数 y=2x,y在观察到x值的变化的同时自身也发生改变。
下面模拟电商发布新产品的流程

被观察者:产品列表

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

//被观察者 产品列表
public class ProductList extends Observable{

    //产品列表
    private List<String> productList = null; 

    private static ProductList instance; //类唯一实例(单例)

    private ProductList(){} //私有化构造方法,禁止new生成实例对象

    //单例对象实例化方法
    public static ProductList getInstance(){
        if(instance == null){
            instance = new ProductList();
            instance.productList = new ArrayList<String>();
        }
        return instance;
    }

    //增加观察者方法(间接调用)
    public void addProductListObserver(Observer observer){
        this.addObserver(observer);
    }

    //变更状态方法(即改变被观察者的状态)
    public void addProduct(String newProduct){
        productList.add(newProduct);
        System.out.println("Add new product :"+newProduct);

        this.setChanged();
        this.notifyObservers(newProduct); 
    }
}

Observable类内部有个changed属性(boolean类型),默认为false,setChanged()方法将changed设置为ture,告诉被观察者你发生了改变。

this.notifyObservers(newProduct) 通知所有的观察者,这里以一个字符串的数据类型(newProduct)作为通知传递给观察者们

notifyObservers()方法的内部调用了Observer接口(观察者们类继承的接口)的update()方法,那么观察者们需要通过重写update()方法来达成自身所需要的一些业务逻辑(比如打印一些信息在屏幕上)

观察者:TBObserver

import java.util.Observable;
import java.util.Observer;

public class TBObserver implements Observer {

    @Override
    public void update(Observable o, Object product) {
         //因为被观察者传递了一个字符串数据通知,所以此处接受到的product是String类型的,只是需要把共同父类Object转换成String
        String newProduct = (String)product;

        //【观察者(this)】 在 观察 到 【被观察者(ProductList)】 发生 改变 的时候,做出动作
        System.err.println("Send new product ["+newProduct+" ] to TB's Online ShoppingMall");
    }

}

观察者:JDObserver

import java.util.Observable;
import java.util.Observer;

public class JDObserver implements Observer {

    @Override
    public void update(Observable o, Object product) {
        // TODO Auto-generated method stub
        String newProduct = (String)product;
        System.err.println("Send new product ["+newProduct+" ] to JD's Online ShoppingMall");
    }

}

测试类

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //被观察者单例对象实例化
        ProductList observable = ProductList.getInstance();

        //实例化观察者对象
        TBObserver tbo = new TBObserver();
        JDObserver jdo = new JDObserver();

        //添加观察者
        observable.addObserver(jdo);
        observable.addObserver(tbo);

        //新增产品,使被观察者对象状态发生改变,从而通知到观察者对象使其做出相应的反应
        observable.addProduct("XXX洗面奶");
    }
}

结果输出

Add new product :XXX洗面奶
Send new product [XXX洗面奶 ] to TB’s Online ShoppingMall
Send new product [XXX洗面奶 ] to JD’s Online ShoppingMall

总结

首先就是多个观察者(TBObserver 和 JDObserver)需要实现观察者接口Observer,重写方法update(Observable o, Object args),第一个参数不需要改变,即Observable类,它建立了【被观察者】和【观察者】间的依赖关系,通过将通知塞给它并告诉它发生了改变,交由它去调用update方法,造成观察者们的改变。第二个参数args即从被观察者那获取到的通知(Object)。被观察者要保证单例,继承Observable类,编写自己需要的改变并调用 notifyObservers()方法。


猜你喜欢

转载自blog.csdn.net/weixin_40932275/article/details/81270002