SSMSSM
首页
  • 我的博客
  • 我的Github
首页
  • 我的博客
  • 我的Github
  • Java反射技术
  • 动态代理模式
  • 设计模式简介
  • 责任链模式
  • 观察者模式
  • 工厂模式与抽象工厂模式
  • 建造者模式
  • Web开发历史
  • Mybatis核心组件
  • Mybatis的反射
  • Mybatis配置

观察者模式

  • 被观察者
  • 观察者1
  • 观察者2
  • 主程序
  • 总结

被观察者

package com.learn.ssm.chapter2.reflect.observer;

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

public class ProductList extends Observable {

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

    private static ProductList instance;//此类的唯一实例(这里体现了单例模式)

    private ProductList() {}//构建方法私有化(不能在外部任意new实例,保证了单例)

    // get唯一实例
    public static ProductList getInstance() {
        if(instance == null) {
            instance = new ProductList();
            instance.products = new ArrayList<String>();
        }
        return instance;
    }

    // 增加一个观察者
    // Observable.addObserver(Observer observer)

    // 被观察者发生更新
    public void addProduct(String newProduct) {
        products.add(newProduct);
        System.out.println("产品列表新增了产品:" + newProduct);

        /**
         * 告知观察者当前被观察者发生了变化
         * Java的Observable类的notifyObservers方法会检查一个布尔值changed,
         * setChanged()就是把这个值设为true的。
         */
        this.setChanged();

        /**
         * 检查changed变量,如果为true,
         * 则遍历所有通过 addObserver(...) 注册进来的观察者,
         * 然后调用它们的 update(...) 方法,并把 newProduct 作为参数传给它们。
         * 调用clearChanged将changed置为false
         */
        this.notifyObservers(newProduct);
    }
}

观察者1

package com.learn.ssm.chapter2.reflect.observer;

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

public class TaoBaoObserver implements Observer {
    @Override
    public void update(Observable o, Object product) {
        String newProduct = (String) product;
        System.out.println("发送新产品【" + newProduct + "】同步到淘宝商城");
    }
}

观察者2

package com.learn.ssm.chapter2.reflect.observer;

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

public class JingDongObserver implements Observer {
    @Override
    public void update(Observable o, Object product) {
        String newProduct = (String) product;
        System.out.println("发送新产品【" + newProduct + "】同步到京东商城");
    }
}

主程序

package com.learn.ssm.chapter2.reflect.observer;

public class Main {
    public static void main(String[] args) {
        ProductList observable = ProductList.getInstance();

        TaoBaoObserver taoBaoObserver = new TaoBaoObserver();
        observable.addObserver(taoBaoObserver);

        JingDongObserver jingDongObserver = new JingDongObserver();
        observable.addObserver(jingDongObserver);

        observable.addProduct("RedMi Note9 Pro");
        /**
         * 产品列表新增了产品:RedMi Note9 Pro
         * 发送新产品【RedMi Note9 Pro】同步到京东商城
         * 发送新产品【RedMi Note9 Pro】同步到淘宝商城
         */
    }
}

总结

观察者模式像订阅公众号一样:

没有观察者模式:

  • 你每天主动去检查喜欢的公众号有没有更新
  • 你要记住所有你关注的公众号
  • 有时候忘了检查,就错过重要消息
  • 太累了,需要主动去问

有观察者模式:

  • 你点击"关注"按钮
  • 然后就不用管了
  • 公众号一发新文章,自动推送到你微信
  • 你不用主动去问,消息自动来找你

让被观察者(公众号)在状态变化时,自动通知所有观察者(粉丝),观察者不用主动去查询状态变化

最近更新:: 2025/10/16 08:05
Contributors: fireworks99
Prev
责任链模式
Next
工厂模式与抽象工厂模式