观察者模式:一种一对多的关系,一个被观察者 Observable,多个观察者 Observer,被观察者发布消息到观察者.
代码示例:模拟微信公众号 实现 订阅主题为被观察者
订阅主题接口
/**
* 订阅的主题 所有主题实现当前接口 (被观察者)
* @author soda
*
*/
public interface Subject {
/**
* 注册一个观察者
* @param observer
*/
void registerObserver(Observer observer);
/**
* 移除一个观察者
*/
void removeObserver(Observer observer);
/**
* 推送一条消息
* @param msg
*/
void setMsg(String msg);
}
3D彩票订阅号 实现订阅主题接口
/**
* 3D彩票订阅号
* @author soda
*
*/
public class ThreeDSubject implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
public void registerObserver(Observer observer) {
if (!observers.contains(observer)) {
observers.add(observer);
}
}
public void removeObserver(Observer observer) {
if (observers.contains(observer)) {
observers.remove(observer);
}
}
public void setMsg(String msg) {
for(Observer observer : observers) {
observer.update(msg);
}
}
}
订阅用户 观察者接口
/**
* 观察者的接口 所有观察者必须实现此接口
* @author soda
*
*/
public interface Observer {
/**
* 更新一条消息
* @param msg
*/
void update(String msg);
}
一个观察者
public class Observer1 implements Observer {
private Subject subject;
public Observer1(Subject subject) {
this.subject = subject;
subject.registerObserver(this);
}
public void update(String msg) {
System.out.println("我是观察者1, 今天的彩票号码是"+msg+",我要发财啦!");
}
}
测试
public class Test {
public static void main(String[] args) {
ThreeDSubject threeDSubject = new ThreeDSubject();
Observer1 observer1 = new Observer1(threeDSubject);
Observer2 observer2 = new Observer2(threeDSubject);
threeDSubject.setMsg("123456");
}
}
使用系统 提供的被观察者类和观察者接口实现
订阅号
/**
* 3D彩票订阅号
*
* 继承系统提供的observable 实现 被观察者
* @author soda
*
*/
public class ThreeDSubject extends Observable {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
//设置数据已改变
setChanged();
//通知所有观察者数据发生改变
notifyObservers();
}
}
观察者
/**
* 观察者
* 实现系统提供的观察者接口 Observer
* @author soda
*
*/
public class ObserverStudent implements Observer {
/**
* 订阅一个主题
*/
public void subscribeSubject(Observable observable) {
observable.addObserver(this);
}
/**
* 处理更新的消息
*/
@Override
public void update(Observable o, Object arg) {
//分别处理每个主题推送的消息
if (o instanceof ThreeDSubject) {
ThreeDSubject subject = (ThreeDSubject) o;
String msg = subject.getMsg();
System.out.println("收到消息:今天的3D开奖号码是:"+msg);
}
}
}
感谢鸿洋大神的教程设计模式 观察者模式 以微信公众服务为例