观察者模式Demo总结

工作之余,写了两个观察者模式的Demo,做做总结

自定义Observer与Observable

 观察者类:

public interface Observer {
    /**
     * 当被观察者变化时,及时反馈至观察者
     * @param objects
     */
    void action(Object... objects);

}

被观察者类:

public abstract class Observable<T> {

    public Vector<T> obs = new Vector<>();
    
    /**
     * 注册观察者对象
     * @param t
     */
    public void registerObserver(T t) {
        isNull(t);
        obs.addElement(t);
    }

    /**
     * 注销观察者对象
     * @param t
     */
    public void unRegisterObserver(T t){
        isNull(t);
        obs.removeElement(t);
    }

    /**
     * 判断传入的观察者对象是否为空
     * @param t
     */
    private void isNull(T t) {
        if (t == null)
            throw new NullPointerException();
    }

    /**
     * 通知观察者做出行为改变
     *
     * @param objects
     */
    public abstract void notifyObservers(Object... objects);
}

创建被观察者类:继承Observable

public class AlarmObservable extends Observable<Observer> {
    @Override
    public void notifyObservers(Object... objects) {
        for (Observer observer : obs) {
            observer.action(objects);
        }
    }
}

创建观察者类:实现Observer

观察者类1:

public class XBObserver implements Observer {

    @Override
    public void action(Object... objects) {
        if (objects.length > 0 && objects[0] != null) {
            LogUtils.e(objects[0].toString() + "XBObserver ");
        }
    }
}

观察者类2:

public class XZObserver implements Observer {
    @Override
    public void action(Object... objects) {
        if (objects.length > 0 && objects[0] != null) {
            LogUtils.e(objects[0].toString() + "XZObserver ");
        }
    }
}

Activity:

/**
     * 按钮点击事件
     * @param view
     */
    public void alarmClick(View view) {
        alarmObservable = new AlarmObservable();
        XBObserver a = new XBObserver();
        XZObserver b = new XZObserver();
        alarmObservable.registerObserver(a);
        alarmObservable.registerObserver(b);
        alarmObservable.notifyObservers("产生变化----");
        alarmObservable.unRegisterObserver(a);
        alarmObservable.notifyObservers("产生变化----");
    }

日志:

实现java.util.Observer与继承java.util.Observable

 被观察者类:

public class JavaUtilObservable extends Observable {
    
    public synchronized void changed(Object arg) {
        setChanged();
        notifyObservers(arg);  //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。
    }
}

两个观察者类:

观察者类1:

public class JavaUtilObserver implements Observer {
    public JavaUtilObserver(JavaUtilObservable ob) {
        super();
        ob.addObserver(this);
    }

    @Override
    public void update(Observable o, Object arg) {
        LogUtils.e(arg+"JavaUtilObserver");
    }
}

观察者类2:

public class JavaUtilObserver2 implements Observer {
    public JavaUtilObserver2(JavaUtilObservable ob) {
        super();
        ob.addObserver(this);
    }

    @Override
    public void update(Observable o, Object arg) {
        LogUtils.e(arg+"JavaUtilObserver2");
    }

}

Activity:

public void java_util_alarmClick(View view) {
        JavaUtilObservable observable = new JavaUtilObservable();
        JavaUtilObserver a = new JavaUtilObserver(observable);
        JavaUtilObserver2 b = new JavaUtilObserver2(observable);
        observable.changed("产生变化----");
        observable.deleteObserver(b);
        observable.changed("产生变化----");
    }

日志:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值