Chinaunix首页 | 论坛 | 博客
  • 博客访问: 337316
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1134
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-25 09:41
个人简介

目前任职于搜狐~

文章分类

全部博文(31)

文章存档

2014年(12)

2013年(19)

分类: Java

2014-02-26 23:35:03

观察者模式属于行为设计模式,是23种设计模式中比较重要也比较常用的设计模式。观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监控一个主题对象。这样当一个主题对象状态发生变化时能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
观察者模式的结构图如下所示:


它包含四种角色:
(1)抽象主题角色(Subject):抽象主题提供一个接口,包含增加、移除和通知观察者的方法。
(2)具体主题角色(ConcreteSubject):具体主题是被观察者所观察的对象,它包含主题所有的观察者列表,是抽象主题的具体实现。当主题状态发生改变时,主动通知观察者。
(3)抽象观察者(Watcher):是具体观察者的抽象接口,它包含更新观察者的方法。
(4)具体观察者(ConcreteWatcher):实现抽象观察者接口,实现提供更新其自身的方法。
下面看下观察者模式的具体代码实现:
1、第一个文件:Subject.java

点击(此处)折叠或打开

  1. /**
  2.  * 抽象主题角色
  3.  */
  4. public interface Subject {
  5.     
  6.     /**
  7.      * 添加观察者
  8.      * @param watcher
  9.      */
  10.     public void addWatcher(Watcher watcher);
  11.     
  12.     /**
  13.      * 移除观察者
  14.      * @param watcher
  15.      */
  16.     public void removeWatcher(Watcher watcher);
  17.     
  18.     /**
  19.      * 通知观察者
  20.      * @param str
  21.      */
  22.     public void notifyWatcher(String str);
  23. }
2、第二个文件:Watcher.java

点击(此处)折叠或打开

  1. /**
  2.  * 抽象观察者
  3.  */
  4. public interface Watcher {

  5.     /**
  6.      * 观察者更新
  7.      * @param str
  8.      */
  9.     public void update(String str);
  10. }
3、第三个文件:ConcreteSubject.java

点击(此处)折叠或打开

  1. import java.util.ArrayList;
  2. import java.util.List;

  3. /**
  4.  * 具体主题角色
  5.  */
  6. public class ConcreteSubject implements Subject {

  7.     /**
  8.      * 主题的观察者列表
  9.      */
  10.     private List<Watcher> list = new ArrayList<Watcher>();
  11.     
  12.     @Override
  13.     public void addWatcher(Watcher watcher) {
  14.         // TODO Auto-generated method stub
  15.         list.add(watcher);
  16.     }

  17.     @Override
  18.     public void removeWatcher(Watcher watcher) {
  19.         // TODO Auto-generated method stub
  20.         list.remove(watcher);
  21.     }
  22.     
  23.     @Override
  24.     public void notifyWatcher(String str) {
  25.         // TODO Auto-generated method stub
  26.         for(Watcher watcher : list){
  27.             watcher.update(str);
  28.         }
  29.     }
  30. }
4、第四个文件:ConcreteWatcher.java

点击(此处)折叠或打开

  1. /**
  2.  * 具体的观察者角色
  3.  */
  4. public class ConcreteWatcher implements Watcher {

  5.     @Override
  6.     public void update(String str) {
  7.         // TODO Auto-generated method stub
  8.         System.out.println(str);
  9.     }
  10. }
5、第五个文件:TestMain.java

点击(此处)折叠或打开

  1. /**
  2.  * 测试Main方法
  3.  */
  4. public class TestMain {

  5.     public static void main(String[] args){
  6.         Subject sbj = new ConcreteSubject();
  7.         Watcher watcher1 = new ConcreteWatcher();
  8.         Watcher watcher2 = new ConcreteWatcher();
  9.         Watcher watcher3 = new ConcreteWatcher();
  10.         Watcher watcher4 = new ConcreteWatcher();
  11.         sbj.addWatcher(watcher1);
  12.         sbj.addWatcher(watcher2);
  13.         sbj.addWatcher(watcher3);
  14.         sbj.addWatcher(watcher4);
  15.         sbj.notifyWatcher("hello world!");
  16.     }
  17. }
如上代码所示,观察者模式的使用还是比较简单清晰的,它的使用流程就是首先抽象出观察者和被观察者,然后具体实现观察者和被观察者,并且被观察者中包含主题发生改变时通知观察者的方法。
观察者模式的优点如下:
(1)它把观察者与被观察者分离,并将二者间的关系通过抽象观察者和抽象被观察者联系在一起,当一方发生变化时不会影响另一方的执行,从而降低了程序的耦合。
(2)可以支持多种不同的具体观察者实现,有利于程序的扩展。
(3)观察者的数目是可变的,主题可以实现动态的增加或移除观察者对象。
(4)被观察者在自身状态发生变化时,会主动通知观察者,如果不是被观察者主动通知,那就需要观察者通过定时任务的方式来监控被观察者的状态是否发生变化,被观察者主动通知的方式要比观察者定时监控方式性能更高。
观察者模式的缺点:
观察者模式是一种常用的触发机制,它形成一条触发链,依次对各个观察者的方法进行处理。但同时,这也算是观察者模式一个缺点,由于是链式触发,当观察者比较多的时候,性能问题是比较令人担忧的。并且,在链式结构中,比较容易出现循环引用的错误,造成系统假死。
阅读(6794) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~