zoukankan      html  css  js  c++  java
  • 观察者模式

    什么是观察者模式?

    观察者模式又称为发布订阅模式,是对象的行为模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监视者被观察者的状态,当被观察者的状态发生变化时,会通知所有观察者,并让其自动更新自己。

    实现观察者模式步骤

    1.定义被观察者

    //被观察者需要继承Observable类
    public class ProductList extends Observable{
        private List<String> productList=null;//产品列表
        
        private static ProductList instance;//类唯一实例
        
        private ProductList() {}//构建方法私有化
        /**
         * 取得唯一实例
         * @return
         */
        public static ProductList getInstance() {
            if(instance==null) {
                instance=new ProductList();
                instance.productList=new ArrayList<String>();
            }
            return instance;
        }
        /**
         * 增加观察者
         * @param observer
         */
        public void addProductListObserver(Observer observer) {
            this.addObserver(observer);
        }
        
        public void addProduct(String newProduct) {
            productList.add(newProduct);
            System.out.println("产品列表新增了产品:"+newProduct);
            //关键两行代码
            this.setChanged();//设置被观察对象发生变化
            this.notifyObservers(newProduct);//通知观察者,并传递新产品,让观察者发生相应变化
        }
    }

    2.定义观察者

    //观察者需要实现Observer接口并重写update方法
    public class JingDongObserver implements Observer {
        
        @Override
        public void update(Observable o, Object product) {
            // TODO Auto-generated method stub
            String newProduct=(String)product;
            System.out.println("发送新产品【"+newProduct+"】同步到京东商城");
        }
    }
    public class TaoBaoObserver implements Observer {
    
        @Override
        public void update(Observable o, Object product) {
            // TODO Auto-generated method stub
            String newProduct=(String)product;
            System.out.println("发送新产品【"+newProduct+"】同步到淘宝商城");
        }
    }


    3.测试

    public static void main(String[] args) {
            // TODO Auto-generated method stub
            ProductList observable=ProductList.getInstance();
            TaoBaoObserver taoBaoObserver=new TaoBaoObserver();
            JingDongObserver jingDongObserver=new JingDongObserver();
            observable.addObserver(jingDongObserver);
            observable.addObserver(taoBaoObserver);
            //产品列表新增一件产品就能同时被不同的电商上架
            observable.addProduct("新增产品1");
        }
    结果:
    产品列表新增了产品:新增产品1
    发送新产品【新增产品1】同步到淘宝商城
    发送新产品【新增产品1】同步到京东商城
    这样就不用一个一个添加产品,更利于扩展和维护。
  • 相关阅读:
    Codeforces Round #650 (Div. 3)
    C. Count Triangles
    A National Pandemic (思维 + 树链剖分模版)
    扫描线专题
    扫描线模版
    莫队模版
    JS设计模式 -- 4种创建型模式
    滑动窗口的最大值 -- 单调队列
    JS链表实现栈和队列
    js数组扁平化的几种实现方式
  • 原文地址:https://www.cnblogs.com/xc-xinxue/p/12373321.html
Copyright © 2011-2022 走看看