观察者的使用

观察者模式

二话不说,上来就是定义


这个好像还好理解那么一点点,不过还是先来讲个情景,

天气预报的短信服务,一旦付费订阅,每次天气更新都会向你及时发送

其实就是我们无需每时每刻关注我们感兴趣的东西,我们只需要订阅它即可,一旦我们订阅的事务有变化了,被订阅的事务就会即时的通知我们

我们来看一下观察者模式的组成:


<李>

观察者,我们称它为观察者,有时候我们也称它为订阅者,即用户

<李>

被观察者,我们称它为可观测,即可以被观察的东西,有时候还会称之为主题,即主题

公共接口ObjectAble {


公共空间添加(ObjectSerType类型,ObjectServer obj);//添加订阅


公共空间删除(ObjectSerType类型,ObjectServer obj);//取消订阅


空白notifyDataChange (ObjectSerType类型,对象……obj);//发送订阅内容

}

2,

公共接口ObjectServer {

空白> a, b, c, d

}

4,实现ObjectAble接口,为每个方法添加逻辑

包com.example.testobjectserver;


进口java.util.ArrayList;进口java.util.HashMap;

进口并不知道;


进口android.util.Log;


公共类ObjectAbleImpelet实现ObjectAble {

公共静态ArrayList比;ObjectServerList=new ArrayList在();


静态ObjectAbleImpelet实例=零;


公共静态ObjectAbleImpelet getInstance () {

同步(ObjectAbleImpelet.class) {

如果(实例==null)

=new ObjectAbleImpelet实例();}

返回实例;

};


@Override

公共空白添加(ObjectSerType类型,ObjectServer obj) {

如果(类型==零,,obj==null)

抛出NullPointerException新(“ObjectSerType或ObjectServer不能空”);

同步(ObjectServerList) {

HashMap地图=new HashMap ();

地图。把(类型、obj);

ObjectServerList.add(地图);

日志。e (“”、“ObjectServerList>在祝辞”+ ObjectServerList);

}

}


@Override

公共空删除(ObjectSerType类型,ObjectServer obj) {

(HashMap地图:ObjectServerList) {

日志。e (“”、“type>在祝辞”+类型),

如果(map.get(类型).equals (obj)) {

ObjectServerList.remove(地图);

日志。e (“”、“obj>在祝辞”+ obj);

打破;

}

}

}


@Override

公共空notifyDataChange (ObjectSerType类型,对象……obj) {

(int i=0;我& lt;ObjectServerList.size ();我+ +){

HashMap地图=ObjectServerList.get (i);

如果(map.containsKey(类型)){

map.get(类型).onRecever (obj);

}

}

}


}

包com.example.testobjectserver;

进口android.app.Activity;

进口android.os.Bundle;

进口android.util.Log;

进口android.view.Menu;

进口android.view.View;

进口android.view.View.OnClickListener;

进口android.widget.TextView;


公共类MainActivity扩展活动实现ObjectServer {


@Override

保护空白> super.onCreate (savedInstanceState);

setContentView (R.layout.activity_main);

ObjectAbleImpelet.getInstance阀门()(ObjectSerType。一个,这个);//添加订阅,类型为ObjectSerType。a类型由开发者定义

findViewById (R.id.button1)。setOnClickListener (new> @Override

公共空>//TODO自动生成方法存根

ObjectAbleImpelet.getInstance () .notifyDataChange (

ObjectSerType。,“你好");//主题发生变化,触,,,,,,//发所有类型为ObjectSerType.a的观察者调用onRecever方法

}

});}


@Override公共布尔>

//膨胀菜单;这将条目添加到操作栏如果礼物。

getMenuInflater () .inflate (R.menu。主菜单);

返回true;

}

,,,,,,,,//主题变化后,观察者的回调

@Override

公共空>日志。e(“”、“我是观察者! ! !”+(字符串)obj [0]);

((TextView) findViewById (R.id.textView1))。setText(" +(字符串)obj [0]);

}


@Override

保护空白> ObjectAbleImpelet.getInstance () .remove (ObjectSerType。一个,这个);

super.onDestroy ();

}


}

观察者的使用“> <h2 class=观察者的使用