总体流程:
a. 实例化被观察者(单例)
b. 被观察者添加观察者
c. 数据变化后,被观察者调用其notifyWatcher()方法,此方法内容是通知所有观察者数据改变。
d. 观察者接收到数据改变信息后的处理。
实例代码如下:
被观察者接口
public interface Watched {
//在其接口中定义一个用来增加观察者的方法
public void add(Watcher watcher);
//再定义一个用来删除观察者权利的方法
public void remove(Watcher watcher);
//再定义一个可以实现行为变现并向观察者传输信息的方法
public void notifyWatcher(Content content);
}
被观察者实现类
public class ConcreteWatched implements Watched {
// 定义一个List来封装Watcher
private List<Watcher> list = new ArrayList<Watcher>();
@Override
public void add(Watcher watcher) {
list.add(watcher);
}
@Override
public void remove(Watcher watcher) {
list.remove(watcher);
}
@Override
public void notifyWatcher(Content content) {
for (Watcher watcher : list) {
watcher.updateNotify(content);
}
}
}
观察者接口
public interface Watcher {
//再定义一个用来获取更新信息接收的方法
public void updateNotify(Content content);
}
观察者
实现类
(
一般用在对应的
Activity
直接实现
Watcher
即可
)
public class ConcreteWatcher implements Watcher {
// 并覆写其方法
@Override
public void updateNotify(Content content) {
// TODO Auto-generated method stub
int id = content.getId();
String name = content.getName();
String address = content.getAddress();
System.out.println("id:" + id + "/n name:" + name + "/n address:" + address);
}
}
给出数据模型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;
}
}
实际调用类MainActivity
public class MainActivity extends Activity implements Watcher {
Handler handler = new Handler();
TextView tv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
doTest();
}
public void doTest() {
// 实例一个被观察者
// 使用时可使用单例,在Application中进行
final Watched watched = new ConcreteWatched();
// //实例第一个观察者对被观察者进行观察
// Watcher watcher1 = new ConcreteWatcher();
// //实例第二个观察者对被观察者进行观察
// Watcher watcher2 = new ConcreteWatcher();
// //实例第三个观察者对被观察者进行观察
// Watcher watcher3 = new ConcreteWatcher();
// //加入对其观察
// watched.add(watcher1);
// watched.add(watcher2);
// watched.add(watcher3);
watched.add(this);
// 当被观察者发生变化时:调用其信息方法
Content content = new Content();
content.setId(1126);
content.setName("tjd");
content.setAddress("suzhou");
doDataChange(watched, content);
// // 被观察者可以调用删除方法
// watched.remove(watcher2);
handler.postDelayed(new Runnable() {
public void run() {
Content content = new Content();
content.setName("wy");
content.setAddress("xuzhou");
content.setId(410);
doDataChange(watched, content);
}
}, 5000);
}
public void doDataChange(Watched watched, Content content) {
watched.notifyWatcher(content);
}
@Override
public void updateNotify(Content content) {
final String s = "mine id = " + content.getId() + " name = " + content.getName();
doShowText(s);
}
protected void doShowText(String s) {
tv.setText(s);
}
}
本地Demo名备忘:ObserverPattern