设计模式-----观察者模式(Obsever)

定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,他的所有依赖者都会收到通知并自动更新。


观察者模式的组成:


抽象主题角色:把所有对观察者对象的引用保存在一个集合中。抽象主题提供一个接口,可以增加和删除观察者角色。

具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。


抽象观察者角色为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。


观察者模式UML图:


观察者模式示例代码:

主题接口类 Subject.Java

[java]  view plain  copy
  1. public interface Subject {  
  2.     public void addObserver(Observer observer);  
  3.   
  4.     public void removeObserver(Observer observer);  
  5.   
  6.     public void notifyObservers(String str);  
  7. }  

具体主题类(可以实现多个) ConcreteSubject.java

[java]  view plain  copy
  1. import java.util.ArrayList;  
  2.   
  3. public class ConcreteSubject implements Subject {  
  4.     ArrayList<Observer> observers = new ArrayList<Observer>();  
  5.   
  6.     public void addObserver(Observer observer) {  
  7.         observers.add(observer);  
  8.     }  
  9.   
  10.     public void removeObserver(Observer observer) {  
  11.         observers.remove(observer);  
  12.     }  
  13.   
  14.     @Override  
  15.     public void notifyObservers(String str) {  
  16.         //通知所有观察者  
  17.         for (Observer o : observers) {  
  18.             o.update(str);  
  19.         }  
  20.     }  
  21. }  


观察者接口类 Observer.java

[java]  view plain  copy
  1. public interface Observer {  
  2.     public void update(String str);  
  3. }  


具体观察者类(可以实现多个)ConcreteObserver.java

[java]  view plain  copy
  1. public class ConcreteObserver implements Observer {  
  2.   
  3.     @Override  
  4.     public void update(String str) {  
  5.         System.out.println("通知了observer--》 " + str);  
  6.     }  
  7. }  

测试类 Test.java

[java]  view plain  copy
  1. /** 
  2.  * 测试观察者模式 
  3.  *  
  4.  * @author neng 
  5.  *  
  6.  */  
  7. public class Test {  
  8.   
  9.     public static void main(String[] args) {  
  10.         // 只要是实现接口的观察者与主题即可. 多对多  
  11.         ConcreteObserver observer1 = new ConcreteObserver();  
  12.         ConcreteObserver observer2 = new ConcreteObserver();  
  13.   
  14.         ConcreteSubject concreteSubject1 = new ConcreteSubject();  
  15.   
  16.         concreteSubject1.addObserver(observer1);  
  17.         concreteSubject1.addObserver(observer2);  
  18.         concreteSubject1.notifyObservers("这个是消息!!!!");  
  19.   
  20.         concreteSubject1.removeObserver(observer2);  
  21.         concreteSubject1.notifyObservers("命令!!");  
  22.     }  
  23.   
  24. }  

观察者模式用途:

AndroidiOS中的Notification即用观察者模式实现。
Java中的事件监听也用观察者模式实现。

多个对象(一对多,多对多)之间通讯可以用观察者模式,主题和观察者之间的耦合度非常低,可拓展性很强!


转载请注明出处:http://blog.csdn.net/xn4545945  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值