设计模式学习之Observer模式
- 今天继续学习设计模式。
学到的两个模式:观察者模式,它属于行为性模式。
- 观察者模式:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 - 适用性:
- 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
- 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
- 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
- 我的理解是:
观察者模式首先定义了一个被观察者,然后让很多的观察者订阅被观察者,而被观察者在自己的状态有了更新时向所有的观察者“推送”自己的状态信息,从而使所有的观察者都得到通知。其实这个模式让人很容易想到当前一种最为潮流的互联网应用:微博。就拿微博为例,每一个人都可以是观察者与被观察者两种身份,当你关注别人的时候,比如你的一个朋友小罗,你就成为了小罗的粉丝,就相当于此时小罗为被观察者,而你自己是观察者身份,你订阅了被观察者,使被观察者在自己状态发生改变时会及时通知你。比如小罗今天去旅游,他将照片发到了微博上,这样你就能及时的看到他的动态了。而且不只是你,他所有的粉丝都能看到他的动态了。而当你的另外一个朋友,比如小杨关注了你,这样你就成为了被观察者,而小杨就是观察者,当你在微博上的个人中心上发状态时,小杨就能实时看到你的状态了,或者会对你的状态进行评论。所以,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 }
作者:everdom
出处:http://everdom.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。