一句话总结我的理解
当我发生改变时调用你(或你们)统一的方法通知你(你们)
解释:
-
这里的“我”是被观察者 ,“你(你们)” 是观察者
-
为啥是我通知你们我改变了
观察一个东西是否改变有两种方法 **用交作业举例子** 1). 我写完了,告诉你 (只有写完时才触发) 2). 课代表过二分钟问你一下你写完没有(到点就触发) 如果是第二种过不了几分钟你就该骂骂咧咧了 (如果是多个课代表你骂骂咧咧的更快) 程序也一样 一直访问会增加服务器压力 (当观察者过多时服务器的访问压力更大)
-
观察者可能有一个或者多个 这个时候是不是要用一个集合保存一下
private ArrayList<Observer> observers;
-
调用统一的方法说明观察者是不是要实现同一个接口
//观察者接口,有观察者来实现 public interface Observer { public void update(float temperature, float pressure, float humidity); }
-
而且还要有个方法通知全部
//遍历所有的观察者,并通知 @Override public void notifyObservers() { // TODO Auto-generated method stub for(int i = 0; i < observers.size(); i++) { observers.get(i).update(this.temperatrue, this.pressure, this.humidity); } }
-
居然是多个观察者那是不是可以增加也可以减少观察者
//注册一个观察者 @Override public void registerObserver(Observer o) { // TODO Auto-generated method stub observers.add(o); } //移除一个观察者 @Override public void removeObserver(Observer o) { // TODO Auto-generated method stub if(observers.contains(o)) { observers.remove(o); } }
当想到这里观察者模式大致结构就出来完了
在观察者模式中有如下角色:
- Subject:抽象主题(抽象被观察者也就是抽象的上文里的我),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
- ConcreteSubject:具体主题(具体被观察者 真正的我),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
- Observer:抽象观察者(用来规范调用的方法的),是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
- ConcrereObserver:具体观察者(上文里的观察者),实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态
观察者模式简单实现 《给室友儿子们带饭》
- 抽象观察者(Roommate)
/**
* 抽象的观察者 嗷嗷待哺的儿子
*/
public interface Roommate {
public void ate(String message);//告诉儿子吃饭了
}
具体观察者(Son)
/**
* 具体的观察者 大儿子
*/
public class EldestSon implements Roommate {
@Override