版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yingxiake/article/details/51526268
什么叫观察者模式:
观察者模式是广播机制,消息订阅和推送的核心设计。
开发中常见的场景:
1.手机中消息推送
2.后台群发信息
观察者模式例子(自己实现)
首先是定义观察者接口并使用三个子类实现
/**
* 观察者接口
*
* @author liuxg
* @date 2016年5月27日 下午10:15:30
*/
public interface IObserver {
public void process();
}
class Observer1 implements IObserver {
@Override
public void process() {
System.out.println("Observer1执行动作");
}
}
class Observer2 implements IObserver {
@Override
public void process() {
System.out.println("Observer2执行动作");
}
}
class Observer3 implements IObserver {
@Override
public void process() {
System.out.println("Observer3执行动作");
}
}
再定义主题,观察者若想获得消息,必须先注册
/**
*
* @author liuxg
* @date 2016年5月27日 下午10:12:18
*/
public class Subject {
List<IObserver> list = new ArrayList<IObserver>();
/***
* 注册观察者
* @param observer
*/
public void registerObserver(IObserver observer){
list.add(observer);
}
/**
* 广播消息
*/
public void send(){
for (IObserver observer : list) {
observer.process();
}
}
}
客户端这样子,我们这样子使用
public class Client01 {
public static void main(String[] args) {
IObserver observer1 = new Observer1();
IObserver observer2 = new Observer2();
IObserver observer3 = new Observer3();
Subject subject = new Subject();
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.registerObserver(observer3);
subject.send();
}
}
接下来我们利用jdk的api来实现观察者模式
观察者模式例子(jdk api)
/**
* 实现观察者
* @author liuxg
* @date 2016年5月28日 下午7:11:43
*/
public class MyObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
int state = ((ConcreteSubject)o).getState();
System.out.println("state = " + state);
}
}
接下来我们来实现主题信息
/**
* 继承jdk的Observable来实现主题信息
* @author liuxg
* @date 2016年5月28日 下午7:10:52
*/
public class ConcreteSubject extends Observable{
private int state ;
public void set(int state) { //状态切换,广播信息
this.state = state;
setChanged();
notifyObservers();
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
客户端测试,可以这样子
public class Client02 {
public static void main(String[] args) {
ConcreteSubject obj = new ConcreteSubject();
MyObserver observer = new MyObserver();
obj.addObserver(observer);
obj.set(123);
}
}