观察者设计模式

来源:互联网 发布:php留言板代码 编辑:程序博客网 时间:2024/06/11 12:43

观察者设计模式之Java实现

观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)。
多个观察者对象同时监听某一个主题对象,当这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。


EventSourceInterface.java(主题对象接口)/** * 事件源(被监听对象) * */public interface EventSourceInterface {/** * 注册监听器 * @param myListener */public void registerListener(MyListenerInterface myListener);/** * 移除监听器 * @param myListener */public void removeListener(MyListenerInterface myListener);/** * 触发监听器 */public void notifyAllListtener();}
Sentry.java(主题对象实现类)import java.util.ArrayList;import java.util.List;/** * 事件源(事件发生的类) *-------哨兵------ */public class Sentry implements EventSourceInterface{    private String name;    private String discription;    private List<MyListenerInterface> listeners;    public Sentry(String name,String discription) {        this.name=name;        this.discription=discription;        listeners=new ArrayList<>();    }    @Override    public void registerListener(MyListenerInterface myListener) {        listeners.add(myListener);    }    @Override    public void removeListener(MyListenerInterface myListener) {        listeners.remove(myListener);    }    @Override    public void notifyAllListtener() {        MyEvent event=new MyEvent(this);        event.setDescription("老师来了");        for (MyListenerInterface listener : listeners) {            listener.update(event);        }    }    @Override    public String toString() {        return "我是" + name +",我在帮"+listeners + discription;    }    public String getName() {        return name;    }    public String getDiscription() {        return discription;    }}

MyListenerInterface .java(观察者接口)/** * 监听接口 */public interface MyListenerInterface {    /**     * 事件响应     * @param  事件类     */    public abstract void update(MyEvent e);}

Student .java(观察者实现类)public class Student implements MyListenerInterface{    private String name;    private String discription;    public Student(String name,String discription){        this.name=name;        this.discription=discription;    }    @Override    public String toString() {        return "正在"+discription+"的"+name;    }    @Override    public void update(MyEvent e) {        Sentry eventSource=(Sentry) e.getEventSource();        System.out.println("我是"+name+                ",我正在"+discription+","+eventSource.getDiscription()+"的"+eventSource.getName()        +"说"+e.getDescription());    }}

MyEvent .java/** * 事件类:封装了事件的信息 * */public class MyEvent {private EventSourceInterface eventSource;private String description;public MyEvent(EventSourceInterface eventSource){this.eventSource=eventSource;}public EventSourceInterface getEventSource(){return eventSource;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}}

public class Client {    public static void main(String[] args) {        Sentry s=new Sentry("小明", "放哨");        Student s1=new Student("小刚", "抄作业");        Student s2=new Student("小强", "吃零食");        s.registerListener(s1);        s.registerListener(s2);        System.out.println(s);        System.out.println("-------------------");        //假设老师来了        s.notifyAllListtener();    }}----------

执行结果:
执行结果

0 0
原创粉丝点击