观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
写一个模拟实例:
1、被观察者自身的行为活动的抽象
/**
* 角色:被观察者自身的行为活动
*
* 知己知彼观察者模式:间谍观察韩非子的活动
*
* @author - 2014-6-23 吖大哥 创建初始版本
*
*/
public interface IHanFeiZi {
// 韩非子踢足球
public void playFootBall();
// 韩非子思考问题
public void thinkQuestion();
}
2、被观察者对象
/**
* 角色:被观察者对象
*
* 被观察者可以自动添加多个不同的观察者并可以移除观察者对象
*
* @author - 2014-6-23 吖大哥 创建初始版本
*
*/
public interface Observeable {
// 添加
public void addObserver(Observer o);
// 删除
public void delObserver(Observer o);
// 通知
public void notifyObserver(String context);
}
3、被观察者实例对象
import java.util.ArrayList;
import java.util.List;
public class HanFeiZi implements IHanFeiZi, Observeable {
private List<Observer> list = new ArrayList<Observer>();
@Override
public void addObserver(Observer o) {
list.add(o);
}
@Override
public void delObserver(Observer o) {
list.remove(o);
}
@Override
public void notifyObserver(String context) {
for (Observer ob : list) {
ob.update(context);
}
}
@Override
public void playFootBall() {
System.out.println("韩非子要踢世界杯了***************");
this.notifyObserver("踢足球");
}
@Override
public void thinkQuestion() {
System.out.println("韩非子开始思考战略谋划了***************");
this.notifyObserver("思考问题");
}
}
4、观察者行为抽象
/**
* 角色:观察者抽象行为
*
* 当发现被观察者行为变动之后自身做出相应的反应
*
* @author - 2014-6-23 吖大哥 创建初始版本
*
*/
public interface Observer {
public void update(String context);
}
5、具体观察者实现
5.1 观察者1
//观察者李斯
public class Lisi implements Observer {
@Override
public void update(String context) {
System.out.println("Lisi 观察到了韩非子在进行:" + context);
}
}
5.2 观察者2
//观察者王斯
public class WangSi implements Observer {
@Override
public void update(String context) {
System.out.println("Wangsi 观察到了韩非子在进行:" + context);
}
}
6、客户端调用测试
//测试客户端 当被观察者执行某个活动之后则会广播给所有的监听观察者,与此同时观察者会做出相应的反应
public class Client {
public static void main(String[] args) throws InterruptedException {
HanFeiZi han = new HanFeiZi();
// 创建观察者
Observer lisi = new Lisi();
Observer wangsi = new WangSi();
// 对被观察者添加观察者对象
han.addObserver(lisi);
han.addObserver(wangsi);
// 被观察者执行活动
han.playFootBall();
Thread.sleep(2000);
System.out.println("\n ================================ \n");
// 被观察者执行活动
han.thinkQuestion();
}
}
7、类图结构