定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,他的所有依赖者都会收到通知并自动更新。
观察者模式的组成:
抽象主题角色:把所有对观察者对象的引用保存在一个集合中。抽象主题提供一个接口,可以增加和删除观察者角色。
具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。
观察者模式UML图:
观察者模式示例代码:
主题接口类 Subject.Java
- public interface Subject {
- public void addObserver(Observer observer);
-
- public void removeObserver(Observer observer);
-
- public void notifyObservers(String str);
- }
具体主题类(可以实现多个) ConcreteSubject.java
- import java.util.ArrayList;
-
- public class ConcreteSubject implements Subject {
- ArrayList<Observer> observers = new ArrayList<Observer>();
-
- public void addObserver(Observer observer) {
- observers.add(observer);
- }
-
- public void removeObserver(Observer observer) {
- observers.remove(observer);
- }
-
- @Override
- public void notifyObservers(String str) {
-
- for (Observer o : observers) {
- o.update(str);
- }
- }
- }
观察者接口类 Observer.java
- public interface Observer {
- public void update(String str);
- }
具体观察者类(可以实现多个)ConcreteObserver.java
- public class ConcreteObserver implements Observer {
-
- @Override
- public void update(String str) {
- System.out.println("通知了observer--》 " + str);
- }
- }
测试类 Test.java
-
-
-
-
-
-
- public class Test {
-
- public static void main(String[] args) {
-
- ConcreteObserver observer1 = new ConcreteObserver();
- ConcreteObserver observer2 = new ConcreteObserver();
-
- ConcreteSubject concreteSubject1 = new ConcreteSubject();
-
- concreteSubject1.addObserver(observer1);
- concreteSubject1.addObserver(observer2);
- concreteSubject1.notifyObservers("这个是消息!!!!");
-
- concreteSubject1.removeObserver(observer2);
- concreteSubject1.notifyObservers("命令!!");
- }
-
- }
观察者模式用途:
Android,iOS中的Notification即用观察者模式实现。
Java中的事件监听也用观察者模式实现。
多个对象(一对多,多对多)之间通讯可以用观察者模式,主题和观察者之间的耦合度非常低,可拓展性很强!
转载请注明出处:http://blog.csdn.net/xn4545945