• 设计模式----观察者模式通俗实例


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

    被观察的对象:主题

    依赖的对象:观察者

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

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

    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版本");
    
        }
    }

    测试结果

  • 相关阅读:
    js操作cookies
    努力挣钱只是不希望我的爱情受到别人金钱的考验罢了
    ASP 删除字符串开始或/和末尾处指定字符(串)
    lhgdialog 窗体之间的传值
    vs2010教程开始
    打开某些网页时IE弹出安全警告
    flex 版本问题
    【jQuery插件】用于瀑布式布局(砖块)的插件jquery Masonry
    自动根据动态的intput计算值
    js日期格式“补零”
  • 原文地址:https://www.cnblogs.com/tk55/p/9251918.html
Copyright © 2020-2023  润新知