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


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

    被观察的对象:主题

    依赖的对象:观察者

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

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

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

    测试结果

  • 相关阅读:
    设置类库项目的程序集名称和默认命名空间
    网上购物系统(Task101)——业务逻辑层BLL(工厂模式实现热插拔)
    网上购物系统(Task102)——登录控件的使用(登录控件的基本配置)
    1.1.3 以类为单位的编程思想
    1.1.2 ADO.NET模型
    网上购物系统(Task100)——业务逻辑层BLL(面向接口的编程模式)
    ASP.NET(C#)命名规范(前缀)
    如果我说,类就是一个人,你会信吗?
    1.1.1 什么是ADO.NET
    [置顶] 编程就是用计算机语言写文章
  • 原文地址:https://www.cnblogs.com/tk55/p/9251918.html
Copyright © 2020-2023  润新知