设计模式学习之Observer模式

  • 今天继续学习设计模式。
    学到的两个模式:观察者模式,它属于行为性模式。
  • 观察者模式:
    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
  • 适用性:
    1. 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
    2. 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
    3. 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
  • 我的理解是:
    观察者模式首先定义了一个被观察者,然后让很多的观察者订阅被观察者,而被观察者在自己的状态有了更新时向所有的观察者“推送”自己的状态信息,从而使所有的观察者都得到通知。其实这个模式让人很容易想到当前一种最为潮流的互联网应用:微博。就拿微博为例,每一个人都可以是观察者与被观察者两种身份,当你关注别人的时候,比如你的一个朋友小罗,你就成为了小罗的粉丝,就相当于此时小罗为被观察者,而你自己是观察者身份,你订阅了被观察者,使被观察者在自己状态发生改变时会及时通知你。比如小罗今天去旅游,他将照片发到了微博上,这样你就能及时的看到他的动态了。而且不只是你,他所有的粉丝都能看到他的动态了。而当你的另外一个朋友,比如小杨关注了你,这样你就成为了被观察者,而小杨就是观察者,当你在微博上的个人中心上发状态时,小杨就能实时看到你的状态了,或者会对你的状态进行评论。所以,Observer模式很容易理解。
    那么,如何来实现它呢?其实很简单,主要是在被观察者上面做文章,被观察者类需要引入三个方法:AddObserver, DeleteObserver, Notify。
    前两个方法用来动态的增加和删除观察者,后面一个方法用来通知所有的观察者。
  • 代码:
  •   1 //被观察者接口
      2 public interface IObservarable
      3 {
      4   public void addObserver(Observer obs);
      5   public void deleteObserver(Observer obs);
      6   public void notify();
      7 }
      8 //被观察者类
      9 public class Observarable implements IObserverable
     10 {
     11   protected ArrayList arrObservers;//存放所有的观察者
     12   protected ArrayList arrStates;//存放自己的状态以便通知所有的观察者
     13   protected String name;
     14   public Observarable(String name)
     15   {
     16     this.name=name;
     17     this.arrObservers=new ArrayList();
     18   }
     19   public void addObserver(Observer obs)
     20   {
     21     arrObservers.add(obs);
     22   }
     23   public void deleteObserver(Observer obs)
     24   {
     25     int i=this.arrObservers.indexof(obs);
     26     if(i>=0)
     27     {
     28       this.arrObservers.remove(i);
     29     }
     30   }
     31   public void notify()
     32   {
     33     this.arrStates=new ArrayList();
     34     this.arrStates.add(this.name);
     35     for(int i=0; i<this.arrObservers.size(); i++)
     36     {
     37       Observer obs=arrObservers.get(i);
     38       obs.update(this, this.arrStates);
     39     }
     40   }
     41   public string getName()
     42   {
     43     return this.name;
     44   }
     45 }
     46 //更加具体的被观察者(拥有自己的状态)
     47 public class Observerable1 extends Observable
     48 {
     49   private State1 state1;
     50   private State2 state2;
     51   public void notify()
     52   {
     53     this.arrStates.add(this.name);
     54     this.arrStates.add(this.state1);
     55     this.arrStates.add(this.state2);
     56     for(int i=0; i<this.arrObservers.size(); i++)
     57     {
     58       Observer obs=arrObservers.get(i);
     59       obs.update(this, arrStates);
     60     }
     61   }
     62   public State1 getState1()
     63   {
     64     return this.state1;
     65   }
     66   public State2 getState2()
     67   {
     68     return this.state2;
     69   }  
     70 }
     71 //观察者接口
     72 public interface IObserver
     73 {
     74   public void update(Observerable o, Object arg);
     75 }
     76 //观察者类
     77 public class Observer implements IObserver
     78 {
     79   protected String name;
     80   public Observer(String name)
     81   {
     82     this.name=name;
     83   }
     84   public void update(Observerable o, Object arg)
     85   {
     86     System.out.println("Observer "+this.name+" has been notified!");
     87   }
     88 }
     89 //更加具体的观察者1(采用拉的方式)
     90 public class Observer1 extends Observer
     91 {
     92   public void update(Observerable o, Object arg)
     93   {
     94     super.update();
     95     System.out.println("I love you!");
     96     System.out.println("I have get the state of "+o.getName());
     97     if(o instanceof Observerable1)
     98     {
     99       System.out.println("state1:"+o.getState1()+", state2:"+o.getState2());
    100     }
    101   }
    102 }
    103 //更加具体的观察者2(采用推的方式)
    104 public class Observer2 extends Observer
    105 {
    106   public void update(Observerable o, Object arg)
    107   {
    108     super.update();
    109     System.out.println("I love you!");  
    110     if(o instanceof Observerable1)
    111     {
    112       System.out.println("I have get the state of "+arg[0].toString());
    113       System.out.println("state1:"+(State1)arg[1].toString()+", state2:"+(State2)arg[2].toString());
    114     }
    115   }
    116 }
    117 public class Test
    118 {
    119   public static void main(string []argv)
    120   {
    121     Observer1 obs1=new Observer1("xiaoluo");
    122     Observer1 obs2=new Observer2("xiaoyang");
    123     Observerable1 obsb1=new Observerable1("xiaoguo");
    124     obsb1.addObserver(obs1);
    125     obsb1.addObserver(obs2);
    126     obsb1.notify();
    127   }
    128 }

     

posted @ 2012-07-25 09:22  everdom  阅读(259)  评论(0编辑  收藏  举报