分享

《Head First设计模式》阅读笔记.第二章

 昵称465563 2010-10-27
1.观察者(Observer)模式部分

*观察者模式:定义了对象之间的一对多依赖关系,当一个对象(主题对象)的状态改变时,它的所有依赖者(观察者对象)都会收到通知并自动更新。

*观察者模式实现了主题对象与观察者对象之间的松耦合,当有新的观察者时,无需修改主题对象的代码,只需要新的观察者对象实现接口。在程序运行的过程中,可以随时注册和删除观察者而不影响主体对象。

*观察者模式使主题(Subject)对象和观察者(Observer)对象都可以被轻易地复用。

软件设计原则:努力在交互对象之间实现松耦合,使它们之间的互相依赖降到最低,从而提高可复用性。

*Java内置了对观察者模式的支持:java.util.Observable类和java.util.Observer接口。

*java.util.Observable类的局限:
1、它是一个类,而不是接口,由于Java不支持多重继承,所以主题类无法同时拥有它和另一个超类的行为,这限制了Observable类的复用潜力。违反了“针对接口编程,而不是针对实现编程”的软件设计原则。
2、它的某些如setChanged()这样的方法被定义为protected,要使用它们就必须继承Observable类,这违反了“多用组合,少用继承”的软件设计原则。
如果上面两条限制妨碍了你的使用,就应该考虑自己设计实现观察者模式。

*在观察者模式中,传递数据的方式有“推”和“拉”两种,Java内置的实现支持这两种方式,然而较常用的为“推”数据。

*观察者模式以松耦合的方式在对象之间传递状态,MVC是其代表。

----代码贴解答----
Java代码 复制代码
  1. import java.uril.Observable;   
  2. import java.util.Observer;   
  3.   
  4. public class ForecastDisplay implements Observer, DisplayElement {   
  5.     private float currentPressure = 29.92f;   
  6.     private float lastPressure;   
  7.        
  8.     public ForecastDisplay(Observable observable) {   
  9.         observable.addObserver(this);   
  10.     }   
  11.        
  12.     public void update(Observable observable, Object arg) {   
  13.         if (observable instanceof WeatherData) {   
  14.             WeatherData weatherData = (WeatherData)observable;   
  15.             lastPressure = currentPressure;   
  16.             currentPressure = weatherData.getPressure();   
  17.                
  18.             display();   
  19.         }   
  20.     }   
  21.        
  22.     public void display() {   
  23.         // 这里显示代码   
  24.     }   
  25. }  

------------

2.观察者(Observer)模式实例

Java代码 复制代码
  1. public interface Subject {   
  2.     public void addObserver(Observer observer);   
  3.   
  4.     public void removeObserver(Observer observer);   
  5.   
  6.     public void notifyObservers();   
  7. }   
  8.   
  9. public interface Observer {   
  10.     public void update(String blog);   
  11. }   
  12.   
  13. //博客   
  14. public class Blogger implements Subject {   
  15.     private List<Observer> observers;   
  16.   
  17.     private String blog;   
  18.   
  19.     public Blogger() {   
  20.         observers = new ArrayList<Observer>();   
  21.     }   
  22.   
  23.     public void addObserver(Observer observer) {   
  24.         observers.add(observer);   
  25.     }   
  26.   
  27.     public void removeObserver(Observer observer) {   
  28.         observers.remove(observer);   
  29.     }   
  30.   
  31.     public void notifyObservers() {   
  32.         for (Observer o : observers) {   
  33.             o.update(blog);   
  34.         }   
  35.     }   
  36.   
  37.     // 发表新博客文章   
  38.     public void writeNewBlog(String blog) {   
  39.         this.blog = blog;   
  40.         notifyObservers();   
  41.     }   
  42. }   
  43.   
  44. //邮件订阅者   
  45. public class EmailSubscriber implements Observer {   
  46.     public void update(String blog) {   
  47.         // 发送电子邮件   
  48.     }   
  49. }   
  50.   
  51. //RSS订阅者   
  52. public class RssSubscriber implements Observer {   
  53.     public void update(String email) {   
  54.         // 更新RSS信息   
  55.     }   
  56. }  


--END--

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多