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

    测试结果

  • 相关阅读:
    3(翻译)如何在cocos2d里面使用动画和spritesheet
    Objectivec2.0 每种数据类型定义属性的方法
    cocos2d 入门必备4个基本概念
    如何在Mac上搭建自己的服务器——Nginx
    JN_0001:在微信朋友圈分享时长大于10s的视频
    JN_0002:Win10禁止U盘拷贝文件的方法
    abstract class 和 interface区别
    ref和out
    .Net配置错误页
    Unity3d 物体沿着正七边形轨迹移动
  • 原文地址:https://www.cnblogs.com/tk55/p/9251918.html
Copyright © 2011-2022 走看看