观察者模式与监听器

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

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

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

该模式主要涉及到:抽象主题(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运行

 

 

 

 

 

 

 

 

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

posted @ 2015-11-04 18:54  googlemeoften  阅读(1603)  评论(0编辑  收藏  举报