参考http://blog.csdn.net/android_cmos/article/details/50489055
基本概念
抽象主题:所有的观察者对象的引用在一个集合中,每个主题都可以有任何数量的观察者,抽象对象提供一个接口,可以增加和删除观察者。(女神类)
具体对象:将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发送通知(小红-一个女神)
抽象观察者:为所有具体观察者定义一个接口,在得到主题通知时更新自己。(一个屌丝对象)
具体观察者:实现抽象观察者所需要的更新接口(小明和老王两个屌丝)
具体代码实现:
女神:
package test_dingyuezhe;
//被观察者
public interface Abatract_model {
//添加观察者
public void AddGuanChaZhe(Abstract_guanChaZhe a);
//删除观察者
public void DelteteGuanChaZhe(Abstract_guanChaZhe a);
//通知观察者
public void NotifyGuanChaZhe(String data);
}
屌丝:
public interface Abstract_guanChaZhe {
//收到抽象主题发出的信息
public void ReceiveData(String data);
}
小红-一个女神:
/*
* 小红--一个主题---订阅的对象
*/
public class XiaoHong implements Abatract_model{
//观察者的集合
private List<Abstract_guanChaZhe> mList=new ArrayList<>();
@Override
public void AddGuanChaZhe(Abstract_guanChaZhe a) {
// TODO Auto-generated method stub
//添加一个观察者对象
mList.add(a);
}
@Override
public void DelteteGuanChaZhe(Abstract_guanChaZhe a) {
// TODO Auto-generated method stub
mList.remove(a);
}
@Override
public void NotifyGuanChaZhe(String data) {
// TODO Auto-generated method stub
for(Abstract_guanChaZhe guancha:mList){
guancha.ReceiveData(data);
}
}
}
小明-一个屌丝:
//其中一个观察者
public class XiaoMing implements Abstract_guanChaZhe{
@Override
public void ReceiveData(String data) {
// TODO Auto-generated method stub
if(data.equals("我病了")){
System.err.println("小明说多喝热水");
}
}
}
老王-一个屌丝:
public class LaoWang implements Abstract_guanChaZhe{
@Override
public void ReceiveData(String data) {
// TODO Auto-generated method stub
if(data.equals("我病了")){
System.err.println("老王说我就去你家");
}
}
}
测试类:
public class MyTest {
public static void main(String[] args) {
//小红说我病了,看小明和老王的表现
XiaoMing xiaoming=new XiaoMing();
LaoWang laownag=new LaoWang();
XiaoHong xiaohong=new XiaoHong();
xiaohong.AddGuanChaZhe(laownag);
xiaohong.AddGuanChaZhe(xiaoming);
xiaohong.NotifyGuanChaZhe("我病了");
xiaohong.DelteteGuanChaZhe(xiaoming);
xiaohong.NotifyGuanChaZhe("我病了");
}
}
输出信息:
老王说我就去你家
小明说多喝热水
老王说我就去你家