Android 設計模式 之 觀察者模式詳解

作爲一隻菜鳥,今天的項目要求用到一堆的設計模式,頓時暈菜,不過還是決定爬起來好好蹂躪它,下面簡單了說說觀察者模式。

先講個小故事。

在某某學校某某班有一個叫丁香 的女生,她年輕貌美,而且成績好。所以班上的男生都喜歡他,追求者無數。其中有十位小哥便是他的忠實粉絲。

偷偷的說一句,這位丁香姑娘便是“被觀察者”,而這十位小哥便是“觀察者”。

有一天 丁香姑娘 和 她的閨蜜 說了一句 她喜歡喫蘋果,這句話被無時不刻“觀察”着她的一言一行的小哥們聽到了。

於是第二天上課的時候,這位 丁香姑娘的 課桌裏邊 居然藏着 十 個蘋果。

有一天  A小哥實在憋不住和丁香表白了,丁香姑娘 說 那個A小哥漲到很矮,和她絕壁沒有可能在一起。這位小哥聽得很傷心,所以不再追求她。

A小哥同宿舍 的一個高個子B小哥聽說說了A小哥的故事,覺得自己有可能,就去接近這位姑涼,姑涼說了看錶現。

如此,B小哥每天觀察着丁香姑娘需要些什麼,有求必應。

故事講完了,結局是什麼,井方哥就不知道啦。

故事講的不好,大概就是這麼一個意思。

總結一句話,很多的“觀察者”同時觀察一個“被觀察者”,被觀察者可以 增加/刪除 每一個“觀察者”,最重要的就是,“被觀察者”當有新的變化時,會調用每一個“觀察者”更新“被觀察者”的變化的方法。

下面以一個案列說明,案列參考了網絡資源,覺得簡單且說明問題。

</pre><pre name="code" class="java">public interface Watcher{
 //再定義一個用來獲取更新信息接收的方法
 public void updateNotify(Content content);
}
//其次定義一個接口爲:抽象被觀察者
public interface Watched{
 //在其接口中定義一個用來增加觀察者的方法
 public void add(Watcher watcher);
 //再定義一個用來刪除觀察者權利的方法
 public void remove(Watcher watcher);
 //再定義一個可以實現行爲變現並向觀察者傳輸信息的方法
 public void notifyWatcher(Content content);
}
//再次就是定義一個類爲:具體觀察者並實現其接口抽象觀察者
public class ConcreteWatcher implements Watcher{
 //並覆蓋其方法
 public void updateNotify(Content content){
   	int id = content.getId();
        String name = content.getName();
	String address = content.getAddress();
	System.out.println("id:"+id++"/n name:"+name+"/n address:"+address);
 }
}
//最後就是定義一個類爲:具體被觀察者並實現其抽象接口抽象被觀察者
public class ConcreteWatched implements Watched{
  //定義一個List來封裝Watcher
  private List<Watcher> list = new ArrayList<Watcher>();
 //並覆蓋其方法
 public void add(Watcher watcher){
       list.add(watcer);
 }
 public void remove(Watcher watcher){
	list.remove(watcher);
 }
 public void notifyWatcher(Content content){
    	for(Watcher watcher : list){
              watcher.updateWatcher(content);
       }
 }
}
//以面向對象的方式來操作,需要定義一個實體來進行操作
public class Content{
 private int id;
 private String name;
 private String address;
 public void setId(int id){
    this.id = id;
 }
 public int getId(){
    return id;
 }
 public void setName{String name}{
    this.name = name;
 }
 public String getName(){
    return name;
 }
 public void setAddress(String address){
    this.address = address;
 }
 public String getAddress(){
    return address
 }
}
//測試類
public classs Test{
 public static void main(String args[]){
	//實例一個被觀察者
    	Watched watched = new Watched();
	//實例第一個觀察者對被觀察者進行觀察
        Watcher watcher1 = new Watcher();
	//實例第二個觀察者對被觀察者進行觀察
	Watcher watcher2 = new Watcher();
	//實例第三個觀察者對被觀察者進行觀察
	Watcher watcher3 = new Watcher();
	//加入對其觀察
	watched.add(watcher1);
	watched.add(watcher2);
	watched.add(watchre3);
	//當被觀察者發生變化時:調用其信息方法 
	Content content = new Content();
	content.setId("0001");
	content.setName("jiangshide");
	content.setAddress("beijing");
	watched.notifyWatchers(content);
	//被觀察者可以調用刪除方法
	watched.remove(watchr2);
	content.setName="litian";
	watched.notifyWatchers(content);
 }
}

觀察者與被觀察者是一個多對一的關係,也就是一個被觀察者可同時被多個觀察者所共同進行關注,,被觀察者更新時,同時對其觀察者會自動更新其信息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章