zoukankan      html  css  js  c++  java
  • 设计模式----观察者模式通俗实例

    观察者模式(一对多的依赖关系):主题对象发生变化时候,通知所有依赖该对象的观察者对象,使得观察者对象更新。

    被观察的对象:主题

    依赖的对象:观察者

    例子:例如一个软件更新版本了,会通知用户版本更新信息

    所有观察者都要实现这个观察者接口

    package com.ij34.observer;
       /*
        * 所有观察者都要实现这个观察者接口
       */
    
    public interface Observer
    {
        void update(Observable o , Object text);
    }

    主题抽象类,里面含有注册、删除、通知观察者

    package com.ij34.observer;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Iterator;
    
    /*
     * 主题抽象类,里面含有注册、删除、通知观察者
     */
    public abstract class Observable
    {
    
        List<Observer> list = new ArrayList<Observer>();
    
        public void registObserver(Observer o)
        {
            list.add(o);
        }
    
        public void removeObserver(Observer o)
        {
            list.remove(o);
        }
    
        public void notifyObservers(Object value)
        {
            for (Observer o : list)
            {
    
                o.update(this , value);
            }
        }
    }

    产品版本升级了,就通知观察者

    package com.ij34.observer;
    /*
     * 产品setter更改了,就通知软件所有订阅的人(观察者),继承Observable类,使用notifyObservers方法
     */
    
    public class Product extends Observable
    {
        private String version;
    
        public Product(){}
        public Product(String version)
        {
            this.version=version;
        }
    
        public String getVersion() {
            return version;
        }
        public void setVersion(String version) {
            this.version = version;
            notifyObservers(version);
        }
    
    }

    软件版本观察者

    package com.ij34.observer;
    /*
     * 当有新的版本时候,通过setter来触发该观察者类VersionObserver
     */
    
    public class VersionObserver implements Observer{
        @Override
        public void update(Observable o, Object text) {
            if(text instanceof String){
                System.out.println("软件已有新版本:"+text);
            }
        }
    }

    测试

    package com.ij34.observer;
    public class Test
    {
        public static void main(String[] args)
        {
          Product p=new Product();
          VersionObserver vo=new VersionObserver();
          p.registObserver(vo);
          p.setVersion("第2018版本");
    
        }
    }

    测试结果

  • 相关阅读:
    UE4使用第三方库读写xml文件
    ROS机器人程序设计(原书第2版)补充资料 教学大纲
    Unity UGUI图文混排(七) -- 下划线
    奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示
    Java复习之泛型
    Java复习之多线程
    Java复习之包及访问控制权限
    Java复习之异常
    Java复习之面向对象高级
    Java复习之面向对象基础
  • 原文地址:https://www.cnblogs.com/tk55/p/9251918.html
Copyright © 2011-2022 走看看