观察者模式的思想很简单,但是确实很实用。
理解
- 就拿期刊来说,我很喜欢一个期刊,会每天都要去报刊亭询问老板有没有。有的话就买,没有则离开。这种做法不仅浪费时间,而且老板都会对你感到厌烦。
- 但是有一天我发现了一种不用每天都要绕一大段路,再也不用看老板的白眼的办法了。那就是订阅,直接在邮局进行订阅,如果有就给我送来(或通知我去拿)。省时省力呀,有木有。
- 其实观察者模式就是跟报刊订阅差不多。
下面是根据我自个的理解写出来的demo,如有错误,请告诉我。万分感谢!
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author clan
* @function 二十四中设计模式之:观察者模式
* @date 2017/12/11.
*/
public class MyObservice {
public Subject subject;
public MyObservice() {
subject = new Subject();
}
public void action() {
// 开始用户登陆/认证
subject.login();
subject.auth();
// 通知观察者队列中的观察者
subject.notifyObservers();
}
public static void main(String[] args) {
MyObservice myObservice = new MyObservice();
// 将想要监听登陆/认证成功的对象,添加到要通知的观察者队列
myObservice.subject.addObserver(new UserAction());
myObservice.subject.addObserver(new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("监听对象2:登陆并认证成功了");
}
});
//开始登陆/认证
myObservice.action();
}
}
/**
* 被观察者 可以是登陆,用户认证之类的
*/
class Subject extends Observable {
public void login() {
System.out.println("登陆");
}
public void auth() {
System.out.println("认证");
}
}
/**
* 监听对象
*/
class UserAction implements Observer {
/**
* 当被观察者更新时,会调用这个方法
*
* @param o 被观察者
* @param arg 参数
*/
@Override
public void update(Observable o, Object arg) {
System.out.println("监听对象1:登陆并认证成功了");
}
}
class Observable {
private List<Observer> list = new ArrayList<Observer>();
public void addObserver(Observer o) {
list.add(o);
}
public void notifyObservers() {
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Observer o = (Observer) iterator.next();
o.update(this, null);
}
}
}
interface Observer {
public void update(Observable o, Object arg);
}