zoukankan      html  css  js  c++  java
  • 观察者模式与监听器

    ---恢复内容开始---

    今天学习了一下观察者模式者模式,于是用博客来记录这一次的学习,以后好复习。

    什么是监听者模式:观察者模式定义一种一对多依赖关系,多个观察者观察一个对象。当被观察的对象状态发生改变时,或者触发了某个被观察对象的的某个时间,就会通知它的观察者;

    该模式主要涉及到:抽象主题(abstract Subject)是被观察者的接口

             具体主题(Subject)是具体被观察的对象

             抽象观察者(abstract Observer)观察者的接口

               具体观察者(Observer)观察者的具体实现

                              还可能会有抽象事件(abstract Event):事件的接口       具体事件(Event):事件的具体实现

    下面有两个例子,一个是普通Java Project中的应用

    被观察者接口:

    public interface Watched {
        public void addListener(Listener listener);
        public void run();
    }

    观察者接口:

    public interface Listener {
        public void addEvent(Event event);
    
        public String getContent();
        
    }

    事件接口:

    public interface Event {
        public String getContent();
        public void setContent(String content);
    }

    被观察者具体实现:

    public class IWatched implements Watched {
        private Listener listener;
    
        @Override
        public void addListener(Listener listener) {
            this.listener = listener;
        }
    
        @Override
        public void run() {
    
            for (int i = 0; i < 10; i++) {
                Event event = new IEvent();
                event.setContent("运行了第" + i + "次");
                listener.addEvent(event);
                listener.getContent();
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    监听者类的具体实现:

    public class IListener implements Listener{
        private Event event;
        @Override
        public void addEvent(Event event) {
            this.event=event;
        }
    
        @Override
        public void getContent() {
            System.out.println(event.getContent());
        }
    }

    事件类的具体实现:

    public class IEvent implements Event{
        private String content;
    
        @Override
        public String getContent() {
            return content;
        }
    
        @Override
        public void setContent(String content) {
            this.content=content;
        }    
    }

    测试类:

    public class Test {
        public static void main(String[] args) {
            Listener listener = new IListener();
            IWatched watched = new IWatched();
            watched.addListener(listener);
            watched.run();
        }
    }

    在Web Project中运行实例:

    被观察者接口:

    public interface Event {
        public String getContent();
        public void setContent(String content);
    }

    观察者接口:

    public interface Listener {
        public void addEvent(Event event);
    
        public String getContent();
    }

    事件接口:

    public interface Event {
        public String getContent();
        public void setContent(String content);
    }

    被观察者具体实现类:

    public class Process implements Watched {
        private Listener listener;
    
        public void addListener(Listener listener) {
            this.listener = listener;
        }
    
        Event event = null;
    
        public void run() {
            for (int i = 0; i < 100; i++) {
                event = new EventImpl();
                event.setContent("第" + i + "运行");
                listener.addEvent(event);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    监听器具体实现类:

    public class ListenerImpl implements Listener {
    
        private String content;
    
        public void addEvent(Event event) {
            this.content = event.getContent();
        }
    
        public String getContent() {
            return content;
        }
    }

    事件具体实现类:

    public class EventImpl implements Event {
        private String content = null;
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }

    第一个测试servlet:

        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Listener listener = new ListenerImpl();
            Process process = new Process();
            process.addListener(listener);
            request.getSession().setAttribute("listener", listener);
            process.run();
        }

    第二个测试servlet:

        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            Listener listener=(Listener) request.getSession().getAttribute("listener");
            System.out.println(listener.getContent());
        }

    不断刷新浏览器页面,控制台打印出如下信息:

    第12运行
    第15运行
    第17运行
    第18运行
    第18运行
    第20运行
    第21运行
    第23运行
    第27运行
    第35运行
    第50运行

    ---恢复内容结束---

  • 相关阅读:
    阿里云证书nginx无法访问带点的路径
    升级阿里云服务器文案
    html模板结合JS替换函数,生成新的记录
    企业使命、原景、战略、战略目标 详解
    Android之Handler用法总结【转】
    android activity的常用代码:关闭、传值、返回值、回调、网页、地图、短信、电话
    PHP十进制转36进制的函数
    [转]仓库管理必须知道的的50条重要知识
    [转]关于项目管理、软件开发的一些思考
    PHP5.5安装PHPRedis扩展
  • 原文地址:https://www.cnblogs.com/googlemeoften/p/4936941.html
Copyright © 2011-2022 走看看