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

    被观察者(Observable)是一个类,使用继承extends,因为它无需子类再去实现什么东西。观察者(Observer)是一个接口,使用实现implements,因为它需要子类去实现update函数,这个函数在被观察者发生变化时被执行。
    一般可理解为,Observable是一个中心数据库,Observer是许多个视图,用于从各个方面展示数据库的数据。

    //SimpleObserver.java
    package org.shu.pxz;
    import java.util.Observable;
    import java.util.Observer;
    
    public class SimpleObserver implements Observer
    {
        public SimpleObserver(SimpleObservable simpleObservable){
            simpleObservable.addObserver(this);//由于是被观察者去通知观察者,那么注册就需要调用被观察者的函数
        }
    
        public void update(Observable observable , Object data){
            System.out.println("Data has changed to " + ((SimpleObservable) observable).getData());
        }
    }
    
    //SimpleObservable.java
    package org.shu.pxz;
    import java.util.Observable;
    
    public class SimpleObservable extends Observable
    {
        private int data = 0;
    
        public int getData(){
            return data;
        }
    
        public void setData(int i){
            if(this.data != i) {
                this.data = i;
                setChanged();//Observable类的成员函数
    
                //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则不调用
                notifyObservers();//Observable类的成员函数
            }
        }
    }
    
    //SimpleTest.java
    import org.shu.pxz.SimpleObservable;
    import org.shu.pxz.SimpleObserver;
    
    public class SimpleTest
    {
        public static void main(String[] args){
            SimpleObservable doc = new SimpleObservable ();//先有中心数据库,再有视图
            SimpleObserver view = new SimpleObserver (doc);//拿视图向中心数据库注册
            doc.setData(1);
            doc.setData(2);
            doc.setData(2);
            doc.setData(3);
        }
    }
    
    //output
    Data has changed to 1
    Data has changed to 2
    Data has changed to 3
  • 相关阅读:
    docker 如何启动空容器
    dotnet5.0 aspnetcore runtime docker镜像
    abp asp.net core 手动获取容器中的服务
    我把代码写在别人的分支了?别慌,有办法解决
    var重复声明为什么后续声明会被忽略
    flex布局不常用到的属性整理
    微信openID和unionID的区别
    js稀疏数组、密集数组、数组空位、手写数组map方法
    vscode格式化代码换行?试试这个配置
    封装一个公共组件并上传到npm仓库
  • 原文地址:https://www.cnblogs.com/season-peng/p/6713482.html
Copyright © 2011-2022 走看看