Observer观察者模式
首先 我们先要知道,观察者模式中主要有观察者和被观察者2个对象,而在观察模式中Observable表示被观察者,由于这个对象是一个抽象类只能被继承。而Observer表示观察者,它并不是一个类而是一个接口,所以观察者可以有多个,实现了该接口的类都属于观察者。
这里我们看到,实现了Observer,只有一个update方法,那么这个方法什么时候被调用呢,很显然,在上面我们有通知的信号,那么这里就是接受到信号后执行的动作。
当然有人会问既然被观察者是一个抽象类而观察者是一个接口,那么是否有一个类即继承Observable类又实现Observer接口呢,这个自然可以,观察者当然也可以同时是被观察者,被观察者同样可以是观察者,在这里完全不冲突。
被观察者(Observable)与观察者(Observer)
当某一个我们需要被观察的对象继承自Observable类时,就表示该类可以被很多观察者(实现了Observer)观察,其实意思就是说这个对象也就是被观察者“上电视了”,电视前的你也就是观察者可以看,(对象发生变化)电视里被观察者做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。
当某一个我们需要被观察的对象继承自Observable类时,就表示该类可以被很多观察者(实现了Observer)观察,其实意思就是说这个对象也就是被观察者“上电视了”,电视前的你也就是观察者可以看,(对象发生变化)电视里被观察者做了别的动作,那么电视前的所有人看到的也就变了,在同一时间改变所有观众看到的画面。
实例:
1,新建MyPerson继承自Observable,表示该类为 "被观察者"
public
class
MyPerson
extends
Observable {
private
int
age;
private
String name;
private
String sax;
public
int
getAge() {
return
age;
}
public
void
setAge(
int
age) {
this
.age = age;
setChanged();
notifyObservers();
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
setChanged();
notifyObservers();
}
public
String getSax() {
return
sax;
}
public
void
setSax(String sax) {
this
.sax = sax;
}
@Override
public
String toString() {
return
"MyPerson [age="
+ age +
", name="
+ name +
", sax="
+ sax +
"]"
;
}
}
注意到:setChanged();notifyObservers();多了这两句调用,而这里就是解决问题二所在,它通过setChanged();告知数据改变,通过notifyObservers();发送信号通知观察者。
2,MyObserver是观察者:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public class MyObserver implements Observer { private int i; private MyPerson myPerson; //观察的对象 public MyObserver( int i){ System.out.println( "我是观察者---->" + i); this .i = i; } public int getI() { return i; } public void setI( int i) { this .i = i; } public MyPerson getMyPerson() { return myPerson; } public void setMyPerson(MyPerson myPerson) { this .myPerson = myPerson; } @Override public void update(Observable observable, Object data) { //如果被观察者 数据发生了改变,这回进入这update中 System.out.println( "观察者---->" + i + "得到更新!" ); this .myPerson = (MyPerson)observable; System.out.println(((MyPerson)observable).toString()); } } |
3,MainActivity
package com.example.mobservermode;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button btn_add;
private Button btn_update;
private ListView lv;
private int i = 1;
//观察者集合
private List<MyObserver> list=new ArrayList<MyObserver>();
//被观察者
private MyPerson observable;
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// 将信息加入list中显示
MyAdapter myListAdapter = new MyAdapter();
lv.setAdapter(myListAdapter);
return false;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
observable = new MyPerson();
lv=(ListView) findViewById(R.id.lv);
btn_add=(Button) findViewById(R.id.btn_add);
btn_update=(Button) findViewById(R.id.btn_update);
btn_add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyObserver myObserver = new MyObserver(i);
i++;
observable.addObserver(myObserver);
list.add(myObserver);
handler.sendEmptyMessage(0);
}
});
btn_update.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
observable.setAge(10 + i);
observable.setName("a" + i);
observable.setSex("男" + i);
handler.sendEmptyMessage(0);
}
});
}
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = new TextView(MainActivity.this);
tv.setTextSize(15);
String personContent = "内容还没添加";
if (list.get(position).getMyPerson() != null) {
personContent = list.get(position).getMyPerson().toString();
}
tv.setText("观察者ID:------>" + list.get(position).getI() + "\n"
+ "观察内容:" + personContent);
return tv;
}
}
}
附件列表
qq3061280@163.com