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);
 }
}

观察者与被观察者是一个多对一的关系,也就是一个被观察者可同时被多个观察者所共同进行关注,,被观察者更新时,同时对其观察者会自动更新其信息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章