zoukankan      html  css  js  c++  java
  • 编程模式之观察者模式(Observer)

    观察者模式由四个角色组成:抽象主题角色,抽象观察者角色,具体主题角色,抽象观察者角色,具体观察者角色

    抽象主题角色(Subject):把所有的观察者角色的引用保存在一个集合中,可以有任意数量的观察者。其提供一个接口,可以添加、删除观察者,并可以向登记过的观察者发送通知。

    具体主题角色(Observer):实现了抽象主题角色提供的接口的一个具体类。

    抽象观察者角色(ConcreteSubject):提供一个借口,以接收主题角色发送的通知。

    具体观察者角色(ConcreteObserver):实现了抽象观察者角色提供的接口的一个具体类。

     类图

    JAVA代码:

    package com.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 抽象主题角色,被观察
     * @author hyp
     *
     */
    public interface Subject
    {
        void addWatcher(Watcher watcher);
        void removeWatcher(Watcher watcher);
        void notify(String message);
    }
    
    
    /**
     * 抽象观察者角色,观察主题
     * @author hyp
     *
     */
    public interface Watcher
    {
        void update(String message);
    }
    
    
    
    
    /**
     * 具体主题角色
     * @author hyp
     *
     */
    public class ConcreteSubject implements Subject
    {
        private List<Watcher> watchers = new ArrayList<Watcher>();
        
        @Override
        public void addWatcher(Watcher watcher)
        {
            watchers.add(watcher);
        }
    
        @Override
        public void removeWatcher(Watcher watcher)
        {
            watchers.remove(watcher);
        }
    
        @Override
        public void notify(String message)
        {
            for(Watcher w:watchers)
            {
                w.update(message);
            }
        }
    }
    
    
    /**
     * 具体观察者橘色
     * @author hyp
     *
     */
    public class ConcreteWatcher implements Watcher
    {
    
        @Override
        public void update(String message)
        {
            System.out.println(this.toString()+ ":" + message);
        }
    }
    
    /**
     * 测试观察者模式
     * @author hyp
     *
     */
    public class Test
    {
        public static void main(String[] args)
        {
            Subject subject= new ConcreteSubject();
            Watcher watcher1 = new ConcreteWatcher();
            Watcher watcher2 = new ConcreteWatcher();
            Watcher watcher3 = new ConcreteWatcher();
            
            Subject.addWatcher(watcher1);//添加观察者
            Subject.addWatcher(watcher2);
            Subject.addWatcher(watcher3);
            
            Subject.notify("Hello");//通知所有观察者
            
            Subject.removeWatcher(watcher1);//移除一个观察者
            
            Subject.notify("bye~");
            
        }
    }
     
  • 相关阅读:
    Inno Setup打包程序添加hosts解析
    elasticsearch安装教程
    初级模拟电路:10-2 分贝与伯德图
    初级模拟电路:10-1 对数图与分贝
    初级模拟电路:9-4 运放的数据规格书(v2)
    初级模拟电路:9-4 运放的数据规格书
    初级模拟电路:9-3 运放的其他参数
    重新部署Azure虚拟机
    Linux-NFS(网络文件系统)服务开启
    STM32_使用DAC双通道同时输出对齐的三角波和方波
  • 原文地址:https://www.cnblogs.com/justmehyp/p/6216120.html
Copyright © 2011-2022 走看看