zoukankan      html  css  js  c++  java
  • 设计模式-6-事件驱动模型

    简介:观察者模式的另一种形态,观察者相当于监听器,被观察者相当于事件源

    目的:事件源产生事件,监听器监听事件

    总结:事件发生-事件处理模型

    组成:监听器,事件源,事件源管理器

    1,基础类

    package com.design.f.observer.event.writer;
    
    import java.io.Serializable;
    /**
     * 用户
     */
    public class User implements Serializable{
        
        private static final long serialVersionUID = 158957714520271405L;
        private String userName;
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        @Override
        public String toString() {
            return super.toString();
        }
        
    }

    2,监听器

    package com.design.f.observer.event.writer;
    
    import java.util.EventListener;
    /**
     * 监听器接口
     */
    public interface WriterListener extends EventListener{
    
        /**
         * 监听的动作
         * @param writerEvent
         */
        void addNovel(WriterEvent writerEvent);
    }
    package com.design.f.observer.event.writer;
    
    /**
     * 监听器
     * 
     * 相当于观察者
     */
    public class Reader implements WriterListener {
        
        //读者用户信息
        private User user;
        
        public Reader(String userName){
            user = new User();
            user.setUserName(userName);
        }
    
        @Override
        public void addNovel(WriterEvent writerEvent) {
            System.out.println("监听器 :" + user.getUserName() + ";  收到事件源 : " + writerEvent.getWriter().getUser().getUserName() + 
                    ", 发布了 -->" +writerEvent.getWriter().getLastBook());
        }
        
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
    
    }

    3,事件源

    package com.design.f.observer.event.writer;
    
    import java.util.EventObject;
    /**
     * 事件源
     */
    public class WriterEvent extends EventObject {
    
        private static final long serialVersionUID = -2594824149603017741L;
    
        /**
         * 初始化事件源
         * @param writer
         */
        public WriterEvent(Writer writer) {
            super(writer);
        }
        
        /**
         * 获取事件源
         * @return
         */
        public Writer getWriter(){
            return (Writer) super.source;
        }
    
        
    }
    package com.design.f.observer.event.writer;
    
    import java.util.HashSet;
    import java.util.Set;
    /**
     * 事件源
     * 
     * 相当于被观察者
     */
    public class Writer {
    
        //作者用户信息
        private User user;
        //作者新书
        private String lastBook;
        //监听器列表
        Set<WriterListener> writerListenerList = new HashSet<>();
        
        public Writer(String userName){
            super();
            //初始化用户信息
            user = new User();
            user.setUserName(userName);
            
            //将作者添加到作者管理器中
            WriterManager.getInstance().addWriter(this);
        }
        
        //作者发布新书动作
        public void pushBook(String bookName){
            System.out.println("事件源 : " + user.getUserName() + ";   发布了新书: " + bookName + " ... ... ");
            lastBook = bookName;
            
            //设置被观察发生改变的状态,并通知所有监听器
            triggerEvent();
        }
        
        //触发事件通知所有监听器
        private void triggerEvent(){
            WriterEvent writerEvent = new WriterEvent(this);
            for(WriterListener writerListener : writerListenerList){
                writerListener.addNovel(writerEvent);
            }
        }
        
        //监听器的添加
        public void addWriterListener(WriterListener writerListener){
            writerListenerList.add(writerListener);
        }
        
        //监听器的取消
        public void removeWriterListener(WriterListener writerListener){
            writerListenerList.remove(writerListener);
        }
        
        public String getLastBook() {
            return lastBook;
        }
        public void setLastBook(String lastBook) {
            this.lastBook = lastBook;
        }
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
        
    }

    4,事件源控制器

    package com.design.f.observer.event.writer;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 观察者管理器 
     */
    public class WriterManager {
        
        //1-作者集合
        private Map<String, Writer> writerMap = new HashMap<String, Writer>();
        
        //2-添加作者
        public void addWriter(Writer writer){
            writerMap.put(writer.getUser().getUserName(), writer);
        }
        
        //3-删除作者
        public void removeWriter(Writer writer){
            writerMap.remove(writer.getUser().getUserName());
        }
        
        //4-获取作者
        public Writer getWriter(String writerName){
            return writerMap.get(writerName);
        }
        
        //5-作者是否存在
        public Boolean isWriter(String writerName){
            return writerMap.containsKey(writerName);
        }
        
        //获取作者集合单例
        private WriterManager(){}
        public static WriterManager getInstance(){
            return WriterManagerInstance.writerManager;
        }
        private static class WriterManagerInstance{
            static WriterManager writerManager = new WriterManager();
        }
        
    
        public Map<String, Writer> getWriterMap() {
            return writerMap;
        }
        public void setWriterMap(Map<String, Writer> writerMap) {
            this.writerMap = writerMap;
        }
    
    }

    5,Main

    package com.design.f.observer.event.writer;
    
    /**
     * 观察者模式-事件驱动模型
     * 观察者更多的强调的是发布-订阅式的问题处理,而事件驱动则更多的注重于界面与数据模型之间的问题
     * 被观察者 = 事件源
     * 观察者     = 监听器
     * 
     * 用例:Tomcat的启动用到的listener监听器,Spring启动添加监听器随着Tomcat的启动IOC容器也开始启动
     */
    public class MainTest {
        
        public static void main(String[] args) {
            
            /**
             * 事件驱动模型-(JDK)
             */
            //1-创建监听器
            Reader readerA = new Reader("读者A");
            Reader readerB = new Reader("读者B");
            Reader readerC = new Reader("读者C");
            Reader readerD = new Reader("读者D");
            
            //2-创建事件源
            Writer writerA = new Writer("莫言");
            Writer writerB = new Writer("路遥");
            
            //3-将监听器添加到事件源
            writerA.addWriterListener(readerA);
            writerA.addWriterListener(readerB);
            writerA.addWriterListener(readerC);
            writerA.addWriterListener(readerD);
            writerB.addWriterListener(readerA);
            writerB.addWriterListener(readerB);
            
            //5-事件源触发事件
            writerA.pushBook("平凡的世界");
            writerB.pushBook("悲惨的世界");
            
            //6-从事件源中移除监听器
            writerB.removeWriterListener(readerA);
            writerB.pushBook("十月围城");
            
        }
    
    }

    6,Result

    事件源 : 莫言;   发布了新书: 平凡的世界 ... ... 
    监听器 :读者A;  收到事件源 : 莫言, 发布了 -->平凡的世界
    监听器 :读者D;  收到事件源 : 莫言, 发布了 -->平凡的世界
    监听器 :读者C;  收到事件源 : 莫言, 发布了 -->平凡的世界
    监听器 :读者B;  收到事件源 : 莫言, 发布了 -->平凡的世界
    事件源 : 路遥; 发布了新书: 悲惨的世界 ... ... 监听器 :读者A; 收到事件源 : 路遥, 发布了
    -->悲惨的世界 监听器 :读者B; 收到事件源 : 路遥, 发布了 -->悲惨的世界
    事件源 : 路遥; 发布了新书: 十月围城 ... ... 监听器 :读者B; 收到事件源 : 路遥, 发布了
    -->十月围城
  • 相关阅读:
    027、Java中的转义字符
    026、Java中改变运算优先级
    025、Java中字符串连接与加法操作一起出现
    024、Java中字符串连接字符串拼接
    023、Java中String的用法
    022、Java中boolean的用法
    021、Java中汉子与数字的相互转换,利用字符变量保存中文
    020、Java中字母大小写转换
    019、Java中定义字符
    018、Java中除法的是用,解决除法计算精度问题
  • 原文地址:https://www.cnblogs.com/wanhua-wu/p/7201950.html
Copyright © 2011-2022 走看看