您的位置:首页 > 编程语言 > Java开发

java设计模式-观察者模式

2016-10-22 10:06 417 查看
大家可能都在用RxJava 或者是EventBus 吧!其实这两种工具都是运用的观察者模式,要想弄懂上面两个库,观察者模式是基础。接下来我就简单的介绍一下观察者模式。

观察者模式分为两个部分:观察者(observer)和被观察者(observable). 和我们平常使用的监听回调不同(一对一),观察者模式采用的是一对多的形式,当被观察者发生改变之后,发送消息给观察者,然后观察者做出相应的改变,这就是观察者模式。

示意图如下:



下面看一个简单的例子:

被观察者:

public class Subject {

private List<Observer> mObservers = new ArrayList<>();

/**
* 绑定被观察者
* @param observer 观察者
*/
public void attach(Observer observer) {
mObservers.add(observer);
}

/**
* 解绑定
* @param observer
*/
public void deAttach(Observer observer) {
mObservers.remove(observer);
}

/**
* 发送通知
* @param name
*/
public void notityAll(String name) {
for (Observer observer : mObservers) {
observer.update(name);
}
}
}

很简单,为了模仿一对多的环境,我们在被观察中,定义了一个集合,这个集合存储观察者对象。notifyAll()方法模式被观察者发生改变,通知观察者。

观察者:

public class Observer {

private Subject mSubject;

public Observer(Subject mSubject) {
this.mSubject = mSubject;
}

public void update(String name) {
System.out.println(System.currentTimeMillis()+<span style="font-family: 'Microsoft YaHei';">"接收到了+ " + name);</span>
}

public void attachSubject() {
if (mSubject != null)
mSubject.attach(this);
}

public void deAttachSubject() {
if (mSubject != null)
mSubject.deAttach(this);
}
}


测试代码:

public class FourActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_four);
Subject mSubject = new Subject();
Observer observer1 = new Observer(mSubject);
observer.attachSubject();
Observer observer2 = new Observer(mSubject);
observer1.attachSubject();
mSubject.notityAll("我是谁");
}

}


运行结果

10-24 10:23:49.211  29086-29086/com.rxjava I/System.out﹕ 1477275829211接收到了+ 我是谁
10-24 10:23:49.211  29086-29086/com.rxjava I/System.out﹕ 1477275829211接收到了+ 我是谁

两个观察者订阅了一个被观察者,被观察者发生改变,发送信息给订阅的观察者。

JAVA中的实现类

其实在Java中有相应的类帮我们实现了设计模式,分别是Observer(观察者) 和 Observable(被观察者) .

下面看一个简单例子:

被观察者:

public class SubjectZD extends Observable {

public void notity(String name) {
<span style="color:#ff0000;"> setChanged();
notifyObservers(name);</span>
}
}

观察者:

public class ObserverZD implements Observer {

public SubjectZD mSubjectZD;

public ObserverZD(SubjectZD mSubjectZD) {
this.mSubjectZD = mSubjectZD;
mSubjectZD.addObserver(this);
}

@Override
public void update(Observable observable, Object data) {
if (observable instanceof SubjectZD) {
System.out.println("observable = " + data.toString());
}
}
}

测试代码:
SubjectZD subjectZD = new SubjectZD();
ObserverZD observerZD = new ObserverZD(subjectZD);
ObserverZD observerZD1 = new ObserverZD(subjectZD);
subjectZD.notity("我是谁");
observer 中主要有两个方法setChanged()和notifyObservers()就可以通知到Observer了。

ok 代码到此结束

有了这个基础我们就方便了解 RxJava 和 EventBus 了,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java java设计模式