今天忙着面试了,第一次面试,,,什么也没准备过,都还没有复习呢,好吧,这一页翻过,继续我的学习。加油!
昨天看懂了回调机制然后理解里android中的回调方法,现在再看观察者模式简直秒懂,同时又理解了当时学习android时遇到了Fragment与MainActivity通信之间的观察者模式。
1、定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
2、结构图:
3、具体事例
最近在csdn上看到一个大神的博客的事例比较不错拿过来用:
有一个被观察者就是运输车,有两个观察者是保镖和强盗,
当被观察者发生变化时,观察者通过Watcher这个借口实现回调。
Watcher类:(Observer)
public interface Watcher {
void update();
}
观察者保镖Security
public class Security implements Watcher{
public void update(){
System.out.println("运输车有行动,保镖出动");
}
}
观察者强盗Thief
public class Thief implements Watcher{
public void update(){
System.out.println("运输车有行动,强盗行动");
}
}
被观察者借口Watched
public interface Watched {
public void add(Watcher watcher);
public void delete(Watcher watcher);
public void notifyWatchers();
}
里面定义了三个方法,分别是增加,删除,通知(回调方法)
transporter类实现了被观察者接口
public class transporter implements Watched{
private List<Watcher> list = new ArrayList<Watcher>();
public void add(Watcher watcher){
list.add(watcher);
}
public void delete(Watcher watcher){
list.remove(watcher);
}
public void notifyWatchers(){
for(Watcher watcher:list){
watcher.update();
}
}
}
测试代码:
public class Test {
public static void main(String args[]){
Security security = new Security();
Thief thief = new Thief();
transporter t = new transporter();
t.add(security);
t.add(thief);
t.notifyWatchers();
}
}
测试结果:
运输车有行动,保镖出动
运输车有行动,强盗行动
摘自大神博客:你推我拉模式
“例子中没有关于数据和状态的变化通知,只是简单通知到各个观察者,告诉他们被观察者有行动。
观察者模式在关于目标角色、观察者角色通信的具体实现中,有两个版本。
一种情况便是目标角色在发生变化后,仅仅告诉观察者角色“我变化了”,观察者角色如果想要知道具体的变化细节,则就要自己从目标角色的接口中得到。这种模式被很形象的称为:拉模式——就是说变化的信息是观察者角色主动从目标角色中“拉”出来的。
还有一种方法,那就是我目标角色“服务一条龙”,通知你发生变化的同时,通过一个参数将变化的细节传递到观察者角色中去。这就是“推模式”——管你要不要,先给你啦。
这两种模式的使用,取决于系统设计时的需要。如果目标角色比较复杂,并且观察者角色进行更新时必须得到一些具体变化的信息,则“推模式”比较合适。如果目标角色比较简单,则“拉模式”就很合适啦。”
后记:。。。其实就是想写一下现在的心情,说不在乎是假的,只是觉得自己要学要做的东西还太多,只能默默的继续努力了。