首页 > 代码库 > 观察者设计模式

观察者设计模式

/**

* 事件接口即被观察者

*

* @author Host

*

*/

publicinterface Event {

    void attach(Listener listener);

    void detach(Listener listener);

    void notifyListener();

}

/**

* 事件监听者观察者

*

* @author Host

*

*/

publicinterface Listener {

    void execute();

}

事件源的一个实现类(磁盘事件)

publicclass DiskEvent implements Event {

    private Set<Listener> listeners;

    public DiskEvent() {

        // TODO Auto-generated constructor stub

        listeners = new HashSet<>();

    }

    @Override

    publicvoid attach(Listener listener) {

        // TODO Auto-generated method stub

        listeners.add(listener);

    }

    @Override

    publicvoid detach(Listener listener) {

        // TODO Auto-generated method stub

        if (listeners.contains(listener)) {

            listeners.remove(listener);

            System.out.println("观察者-->" + listener.toString()

                    + "-已经不再监听我");

        }

    }

    @Override

    publicvoid notifyListener() {

        // TODO Auto-generated method stub

        System.out.println("日志:DIskEvent 正在通知观察者们!");

        if (listeners.size() > 0) {

            for (Listener listener : listeners) {

                listener.execute();

            }

        }

        System.out.println("日志:DIskEvent 的观察者们执行完毕!");

    }

}

磁盘时间的两个观察者(磁盘观察者和系统观察者)

/**

* 磁盘观察者

* @author Host

*

*/

publicclass DiskListener implements Listener {

    @Override

    publicvoid execute() {

        // TODO Auto-generated method stub

        System.out.println("我是磁盘监听器,有人通知我磁盘发生了改变...");

        try {

            Thread.sleep(5000);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        System.out.println("我完成了任务,用时5秒。");

    }

 

}

/**

* 系统观察者

* @author Host

*

*/

publicclass SystemListener implements Listener {

 

    @Override

    publicvoid execute() {

        // TODO Auto-generated method stub

        System.out.println("我是系统监听器(负责监视系统中所有事件),有人通知我磁盘发生了改变...");

        try {

            Thread.sleep(5000);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        System.out.println("我向注册表中写了内容,用时5秒。");

    }

}

 

/**

* 测试设计模式是否正确运行

*

* @author Host

*

*/

publicclass ObserverDemo {

    publicstaticvoid main(String[] args) {

        // TODO Auto-generated method stub

        System.out.println("测试观察者设计模式是否正确运行!");

        System.out.println("--------------------开始--------------------");

        // 创建观察者

        Listener sysListener = new SystemListener();

        Listener diskListener = new DiskListener();

        // 休息6

        sleep(6);

        System.out.println("磁盘观察者和系统观察者初始化完毕。");

        // 创建被观察者

        Event diskEvent = new DiskEvent();

        // 休息6

        sleep(6);

        System.out.println("磁盘事件源----------初始化完毕");

        // 为被观察者添加观察者

        diskEvent.attach(diskListener);

        // 休息3

        sleep(3);

        System.out.println("磁盘事件源----------添加磁盘观察者成功!");

        diskEvent.attach(sysListener);

        // 休息5

        sleep(5);

        System.out.println("磁盘事件源----------添加系统观察者成功!");

        // 唤醒观察者们

        // 休息5

        sleep(5);

        System.out.println("磁盘事件源----------正在唤醒观察者们。。。");

        // 休息5

        sleep(5);

        diskEvent.notifyListener();

        // 删除系统观察者

        diskEvent.detach(sysListener);

        System.out.println("磁盘事件源----------删除系统观察者后。。。");

        // 休息5

        sleep(5);

        // 删除系统观察者后再次唤醒观察者们。。。

        diskEvent.notifyListener();

        // 休息5

        sleep(5);

        System.out.println("--------------------结束--------------------");

        // 休息5

        sleep(5);

        System.out.println("观察者设计模式正确运行!");

 

    }

 

    publicstaticvoid sleep(int time) {

        int t = time * 1000;

        try {

            Thread.sleep(t);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

测试结果输出