• 编程模式之观察者模式(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~");
            
        }
    }
     
  • 相关阅读:
    江西师范大学瑶湖校区图片
    什么是sp?
    教育技术学硕士点学校排名
    西南师大教育技术学专业2005年入学考试信息
    什么是"工包"?
    买书网址
    2006年全国教育技术学专业新增硕士点
    今天终于拿到书了
    2007年教育学专业基础综合考试大纲(重要部分) ——下载地址
    电脑DIY推荐
  • 原文地址:https://www.cnblogs.com/justmehyp/p/6216120.html
Copyright © 2020-2023  润新知