书接上回,上一周大体写了一下回调函数的使用,这周我就大体说一下设计模式中的观察者模式。我自己认为观察模式就是回调函数的升级版,在用法上。废话少说,直接上图。
这是我正在弄的一个应用,画面有点模仿荔枝电台了,在这里感谢荔枝电台提供这么简洁的UI。本来这个项目的第一版使用的模式是回调加广播的形式。但是在重构代码的时候,我想了想何不使用观察者模式呢,这样能减少很多不必要的麻烦。
简单地说,观察者模式定义了一个一对多的依赖关系(也可以一对一),让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。通过这个解释,大家是不是认为上面的这个项目使用观察者模式是可不错的选择呢。哈哈,继续闲扯。
我不想画那种UML图(因为我水平有限,画不好,哈哈哈),我怕画多了自己迷糊了,也把你们弄迷糊了,如果需要看到的话,可以留言,到时我在认真的给补上。
观察者模式有观察者和被观察的对象。上面的那个项目,各个Activity是观察者,播放的类是被观察者,所以观察者不知道有多少个观察者,只做好自己的工作就可以,根据需求进行变化。
第一步:被观察者和观察者的两个类:
这里是被观察者的抽象类;
<pre name="code" class="html">package com.lbc.observer;
import java.util.ArrayList;
import java.util.List;
public abstract class Subject {
private List<Observer> observers = new ArrayList<Observer>();
//这个代替我们要观察的状态
public String str;
public void addObserver(Observer observer) {
if (!observers.contains(observer)) {
observers.add(observer);
}
}
public void removeObserver(Observer observer) {
if (observers.contains(observer)) {
observers.remove(observer);
}
}
/**
* 把一个类的对象给观察者
*
* 这里可以修改成和上篇回调函数一样的样式,推送变量给观察者
* http://blog.csdn.net/liujianshui/article/details/46709229
*/
public void nodifyObservers() {
for (Observer observer : observers) {
observer.update(Subject.this);
}
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
这里是观察者的接口类:
package com.lbc.observer;
public interface Observer {
//这里你可以定义好几个方法
public void update(Subject s);
}
2.现在要完成的是继承了Subject这个抽象类的子类,和实现了Observer这个接口的子类:
这是继承了Subject这个抽象类的子类
package com.lbc.observer;
public class MySubject extends Subject {
public void changMethod() {
// 设置我们的状态
setStr("大家好,我是被观察者的子类哦");
// 唤醒观察者
nodifyObservers();
}
}
package com.lbc.observer;
public class Test {
public static void main(String[] args) {
MySubject mySubject = new MySubject();
mySubject.addObserver(new Observer() {
@Override
public void update(Subject s) {
System.out.println("第一个观察者" + s.getStr());
}
});
mySubject.addObserver(new Observer() {
@Override
public void update(Subject s) {
System.out.println("第二个观察者"+s.getStr());
}
});
mySubject.addObserver(new Observer() {
@Override
public void update(Subject s) {
System.out.println("第三个观察者"+s.getStr());
}
});
mySubject.changMethod();
}
}
这样简单的观察者模式就算结束了,但是真正在工作了,没有这么简单,还需要大家学会变通。如果上面看不懂的话,就留言,我把代码发给你。希望大家多多批评指正,让我能有进步。生命不止,学习不休。加油。由于上面的项目代码有保密条例,不方便发,但是大家有这方面问题,我们可以讨论哦。
下周的博客打算写代理模式,但是我不知道能不能找到一个好的例子表达这个代理模式,找到就写,找不到就改题材,哈哈。希望顺利。