观察者模式
在Android开发中用的还是比较多的,RXJava和Agera这种响应式编程框架的底层就是观察者模式。
这个例子使用彩民和彩票公众号之间的关系,模拟实现了观察者模式。
下面看下类图
首先有个Obserable即被观察者
这里使用接口实现
package observer;
/**
* 所有主题必须实现这个被观察者接口
*
*/
public interface Observable {
/**
* 注册一个观察者
*/
public void registerObserver(Observer observer);
/**
* 移除一个观察者
*/
public void removeObserver(Observer observer);
/**
* 通知所有观察者
*/
public void notifyObservers();
}
然后是观察者接口 Observer
/**
* 所有观察者需实现此接口
*/
public interface Observer {
// 观察者收到事件时的处理
// 此处写自己的业务
public void update(String msg);
}
下面就是实现了
彩票公众号需实现Observable
/**
* 被观察者的实现类
*
* @author TerryYang
*
*/
public class ObjectFor3D implements Observable {
// 所有注册在此的观察者
private List<Observer> mObservers = new ArrayList<>();
// 3D彩票号码
private String mMsg;
@Override
public void registerObserver(Observer observer) {
mObservers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
mObservers.remove(observer);
}
// 通知所有观察者
@Override
public void notifyObservers() {
for (Observer o : mObservers) {
o.update(mMsg);
}
}
// 发布彩票号
public void setMsg(String msg) {
mMsg = msg;
notifyObservers();
}
}
彩民需实现观察者
/**
* 彩民1 注册观察者
*
* @author TerryYang
*
*/
public class Person1 implements Observer {
private Observable mSubject;
// 在构造函数中注册观察者
public Person1() {
mSubject = new ObjectFor3D();
mSubject.registerObserver(this);
}
// 此方法会在被观察者的notifyAll方法中被回调
@Override
public void update(String msg) {
System.out.println("彩民1 得到彩票号码: " + msg);
}
}
另一个跟这个一样,不贴代码了
Main函数调用
用主函数模拟实际的业务
public class Main {
public static void main(String[] args) {
// 两个彩民
Observer p1 = new Person1();
Observer p2 = new Person2();
// 订阅彩票号
ObjectFor3D s = new ObjectFor3D();
s.registerObserver(p1);
s.registerObserver(p2);
// 彩票号发布信息
s.setMsg("1001");
}
}
输出结果
彩民1 得到彩票号码: 1001
彩民2 得到彩票号码: 1001
Java Util 包中也有观察者的实现,使用方式类似
源码下载:
https://github.com/yangtianrui95/Java–Design_Pattern
参照:
http://blog.csdn.net/lmj623565791/article/details/24179699