定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
优点:1.观察者和被观察者是抽象耦合的
缺点:1.目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
2.当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
使用场景:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
原理:在抽象类里有一个 ArrayList 存放观察者们。
类图:
栗子
观察者做出相应行为的方法的接口
1. 2. public interface Observer { 3. 4. void update(Observable o); 5. 6. }
观察者的实现类
1. public class ConcreteObserver1 implements Observer{ 2. 3. public void update(Observable o) { 4. System.out.println("观察者1做出相应"); 5. } 6. 7. }
1. public class ConcreteObserver2 implements Observer{ 2. 3. public void update(Observable o) { 4. System.out.println("观察者2做出相应"); 5. } 6. 7. }
被观察者
1. public class Observable { 2. 3. List<Observer> observers = new ArrayList<Observer>(); 4. 5. public void addObserver(Observer o){ 6. observers.add(o); 7. } 8. 9. public void changed(){ 10. System.out.println("我是被观察者,我已经发生变化了"); 11. notifyObservers();//通知观察自己的所有观察者 12. } 13. 14. public void notifyObservers(){ 15. for (Observer observer : observers) { 16. observer.update(this); 17. } 18. } 19. }
调用
1. public class Client { 2. 3. public static void main(String[] args) throws Exception { 4. Observable observable = new Observable(); 5. observable.addObserver(new ConcreteObserver1()); 6. observable.addObserver(new ConcreteObserver2()); 7. 8. observable.changed(); 9. } 10. }