Java设计模式_行为型_观察者模式_任意行为的监听

来源:互联网 发布:美津浓跑鞋矩阵图 编辑:程序博客网 时间:2024/05/22 14:06

转载请注明出处:http://blog.csdn.net/ljmingcom304/article/details/50435725
本文出自:【梁敬明的博客】

1. 什么是被观察者

  被观察者指的是当其行为或状态发生变化时,第一时间通知观察者,观察者对其行为或状态的变化做相应的回应。当观察者需要接受通知时,需要在被观察者中进行注册,当不再接收通知时,在被观察者中移除注册即可。当被观察者行为或状态发生变化时,可以通知观察者,让其指定方法做出响应。

//被观察者public interface Subject {    // 注册观察者    void registerObserver(Class<?> clazz);    // 反注册观察者    void removeObserver(Class<?> clazz);    // 通知观察者的指定方法做出响应    void notifyObservers(String methodName, Object... obj);}public class SubjectImpl implements Subject {    private List<Class<?>> list = new ArrayList<Class<?>>();    //通知观察者的指定方法做出响应    @Override    public void notifyObservers(String methodName, Object... objs) {        for (Class<?> clazz : list) {            Method[] methods = clazz.getMethods();            for (Method method : methods) {                if (method.getName().equals(methodName)) {                    try {                        method.invoke(clazz.newInstance(), objs);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }        }    }    // 添加观察者到注册列表    @Override    public void registerObserver(Class<?> clazz) {        if (clazz != null) {            list.add(clazz);        }    }    // 从注册列表中移除观察者    @Override    public void removeObserver(Class<?> clazz) {        if (clazz != null) {            list.remove(clazz);        }    }}

2. 什么是观察者

  观察者可以是任意对象,只要在被观察者中进行了注册,就可以接收观察者的行为或状态的变化,被观察者可以指定观察者的任意公开方法做出响应。

public class ZhangSan{    public void update() {        System.out.println("张三");    }}public class WangWu{    public void update() {        System.out.println("王五");    }    public void doSomething() {        System.out.println("做一些事情");    }}

3. 行为的动态监听

  创建一个被观察者,将观察者注册到被观察者中,同时通知观察者的任意公开方法做出响应。

public class Client {    public static void main(String[] args) {        Subject sub = new SubjectImpl();        sub.registerObserver(ZhangSan.class);        sub.registerObserver(WangWu.class);        sub.notifyObservers("update");        sub.notifyObservers("doSomething");    }}
0 0