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() {@Overridepublic boolean handleMessage(Message msg) {// 将信息加入list中显示MyAdapter myListAdapter = new MyAdapter();lv.setAdapter(myListAdapter);return false;}});@Overrideprotected 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() {@Overridepublic void onClick(View v) {MyObserver myObserver = new MyObserver(i);i++;observable.addObserver(myObserver);list.add(myObserver);handler.sendEmptyMessage(0);}});btn_update.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {observable.setAge(10 + i);observable.setName("a" + i);observable.setSex("男" + i);handler.sendEmptyMessage(0);}});}private class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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


浙公网安备 33010602011771号