最近正好闲来无事,正好做完项目,由于里面用到了RxJava,有些许体会,但今天我在这儿,并不会讲RXjava,任何事情都有个循序渐进的过程,后续我会陆续讲RXJAVA并用很通俗的语言,毕竟我每次看到一些博客都有太多专业术语,导致理解起来困难.若你给出了专业术语,你也该解释下啥.废话不说了,下面我们就来讲解观察者与被观察者.
- Observer 观察者,说白了就是观察别人.(你这不是,废话吗!)
- Obserable 被观察者
- 注册或者订阅 说白了,就是说明 被观察者指定哪个观察者来观察自己
那我们先来看看三者的关系:
首先被观察者发生了改变,就需要告知观察者,然后观察者会做出相应的措施.二者需要联系起来就靠注册或者订阅.
具体例子借助Android里面的按钮点击事件:
首先button 是被观察者, OnClickListener是观察者, 那该button需要被哪个观察者观察呢?怎样才能联系起来呢,这就需要注册或者订阅.你是否想到了: setOnClickListener.这不是把二者联系起来了.
下面来一个具体例子,再说这个例子之前,先还要继续添加点知识点:
我们先要知道,观察者模式中主要有观察者和被观察者2个对象,而在观察模式中Observable表示被观察者,由于这个对象是一个抽象类只能被继承。而Observer表示观察者,它并不是一个类而是一个接口,所以观察者可以有多个,实现了该接口的类都属于观察者。 当然有人会问既然被观察者是一个抽象类而观察者是一个接口,那么是否有一个类即继承Observable类又实现Observer接口呢,这个自然可以,观察者当然也可以同时是被观察者,被观察者同样可以是观察者,在这里完全不冲突。
//被观察者
public class MyObservable extends Observable{
int age;
String name=”lihuan”;
String sex;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
setChanged();
notifyObservers();
}
@Override
public String toString() {
return “age = “+age+”;”+”name = “+name+”;”+” sex = “+sex;
}
}
//观察者
public class MyObserver implements Observer {
MyObservable myObservable;
@Override
public void update(Observable observable, Object data) {
this.myObservable= (MyObservable) observable;
System.out.println("========"+ myObservable.toString());
}
}
//主函数
public class MainActivity extends Activity {
Button button;
MyObservable myObservable;
MyObserver myObserver;
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myObservable=new MyObservable();
myObserver=new MyObserver();
myObservable.addObserver(myObserver);
button= (Button) findViewById(R.id.my_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (count==0){
myObservable.setAge(24);
count++;
}else if (count==1){
myObservable.setSex("男");
count=0;
}
}
});
}
}