作为一只菜鸟,今天的项目要求用到一堆的设计模式,顿时晕菜,不过还是决定爬起来好好蹂躏它,下面简单了说说观察者模式。
先讲个小故事。
在某某学校某某班有一个叫丁香 的女生,她年轻貌美,而且成绩好。所以班上的男生都喜欢他,追求者无数。其中有十位小哥便是他的忠实粉丝。
偷偷的说一句,这位丁香姑娘便是“被观察者”,而这十位小哥便是“观察者”。
有一天 丁香姑娘 和 她的闺蜜 说了一句 她喜欢吃苹果,这句话被无时不刻“观察”着她的一言一行的小哥们听到了。
于是第二天上课的时候,这位 丁香姑娘的 课桌里边 居然藏着 十 个苹果。
有一天 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);
}
}
观察者与被观察者是一个多对一的关系,也就是一个被观察者可同时被多个观察者所共同进行关注,当,被观察者更新时,同时对其观察者会自动更新其信息。