一、概念
观察者设计模式: 行为型的设计模式,也叫作发布订阅模式。
两个角色:被观察者(Observer),观察者(Observerable)。
被观察者维护观察者实例列表,当有事件发生时,调用观察者的方法进行通知。
二、代码实现
1、观察者
/**
* 观察者
*/
public interface Observer {
// 被观察者有事件产生时,通过这个方法通知观察值
public void onMessage(EventObject eventObject);
}
/**
* 观察者实例
*/
public class MyObserver1 implements Observer {
@Override
public void onMessage(EventObject eventObject) {
Log.d("lixm","我是Observer_1,我收到了消息。。。" + eventObject.data);
}
}
/**
* 观察者实例
*/
public class MyObserver2 implements Observer {
@Override
public void onMessage(EventObject eventObject) {
Log.d("lixm","我是Observer_2,我收到了消息。。。" + eventObject.data);
}
}
2、被观察者
/**
* 被观察者
*/
public interface Observerable {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void sendMsg2Observer(EventObject eventObject);
}
/**
* 被观察者实例
*/
public class MyObserverable implements Observerable {
private static MyObserverable instance; // 单例
private MyObserverable(){}; // 不让别人new
public List<Observer> observers; // 用于存放观察者
public static MyObserverable getInstance(){
if(instance == null){
synchronized (MyObserverable.class){
if(instance == null){
instance = new MyObserverable();
}
}
}
return instance;
}
@Override
public void registerObserver(Observer observer) {
if(observers == null){
observers = new ArrayList<>();
}
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(observers != null && observers.size() > 0){
observers.remove(observer);
}
}
@Override
public void sendMsg2Observer(EventObject eventObject) {
if(observers != null && observers.size() > 0){
for(Observer observer : observers){
if(eventObject != null){
observer.onMessage(eventObject);
}
}
}
}
}
3、消息的封装
/**
* 发送事件的封装
*/
public class EventObject {
public String action;
public String type;
public Object data;
}
4、测试代码
public class TestActivity extends Activity {
public Observer observer1;
public Observer observer2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_observer);
observer1 = new MyObserver1();
observer2 = new MyObserver2();
MyObserverable.getInstance().registerObserver(observer1);
MyObserverable.getInstance().registerObserver(observer2);
Button btnSendMsg = (Button)findViewById(R.id.btnSendMsg);
btnSendMsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventObject eventObject = new EventObject();
eventObject.action = "EVENT_ACTION_ONCLICK";
eventObject.data = "发生了点击事件";
MyObserverable.getInstance().sendMsg2Observer(eventObject);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
MyObserverable.getInstance().removeObserver(observer1);
MyObserverable.getInstance().removeObserver(observer2);
}
}
//==========R.layout.activity_test_observer==================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/md_common_padding"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/llV"
android:orientation="vertical">
<Button
android:id="@+id/btnSendMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:text="发送事件"/>
</LinearLayout>
</LinearLayout>
5、运行结果
07-10 08:35:05.692 3942 3942 D lixm : 我是Observer_1,我收到了消息。。。发生了点击事件
07-10 08:35:05.692 3942 3942 D lixm : 我是Observer_2,我收到了消息。。。发生了点击事件