設計模式學習之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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。

浙公網安備 33010602011771號