今天回顾了下观察者模式,网上有简单的,也有复杂的,但是万变不离其宗。
观察者模式有两个角色:发布者(Subject)和订阅者(Observer),发布者拥有订阅者的一个列表,当发布者需要通知订阅者时,遍历列表中的订阅者,逐一调用事件通知给每一个订阅者,这样就完成了观察者模式。
1.发布者
import java.util.ArrayList;
import java.util.List;
public class Subject {
//list of observer
private List<Observer> list = new ArrayList<Observer>();
public void AddObserver(Observer observer){
System.out.println("add observer wiht name: " + observer.GetName());
list.add(observer);
}
public void RemoveObserver(Observer observer){
System.out.println("remove observer wiht name: " + observer.GetName());
list.remove(observer);
}
public void NotifyAllObserver(String message){
for(Observer observer : list){
observer.Update(message);
}
}
}
2.订阅者
public class Observer {
private String name;
public Observer(String name){
this.name = name;
}
public String GetName(){
return this.name;
}
public void Update(String message){
System.out.println(message);
}
}
3.测试
public class Hello {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Subject subject = new Subject();
Observer observer1 = new Observer("admin1");
Observer observer2 = new Observer("admin2");
Observer observer3 = new Observer("admin2");
subject.AddObserver(observer1);
subject.AddObserver(observer2);
subject.AddObserver(observer3);
subject.NotifyAllObserver("Hello");
}
}
4.输出
add observer wiht name: admin1
add observer wiht name: admin2
add observer wiht name: admin2
Hello
Hello
Hello
总结:
可以在观察者和订阅者的基础上抽提出抽象类,然后发布的事件也可以抽提出接口,从而演化出更为复杂的观察者模式。