1.观察者模式:简单地说,观察者模式定义了一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
2.观察者模式应用场景实例:
http://blog.csdn.net/swengineer/article/details/6268244
/**
* 观察者模式应用场景实例
*
* 免责声明:本文只是以哈票网举例,示例中并未涉及哈票网任何业务代码,全部原创,如有雷同,纯属巧合。
*
* 场景描述:
* 哈票以购票为核心业务(此模式不限于该业务),但围绕购票会产生不同的其他逻辑,如:
* 1、购票后记录文本日志
* 2、购票后记录数据库日志
* 3、购票后发送短信
* 4、购票送抵扣卷、兑换卷、积分
* 5、其他各类活动等
*
* 传统解决方案:
* 在购票逻辑等类内部增加相关代码,完成各种逻辑。
*
* 存在问题:
* 1、一旦某个业务逻辑发生改变,如购票业务中增加其他业务逻辑,需要修改购票核心文件、甚至购票流程。
* 2、日积月累后,文件冗长,导致后续维护困难。
*
* 存在问题原因主要是程序的"紧密耦合",使用观察模式将目前的业务逻辑优化成"松耦合",达到易维护、易修改的目的,
* 同时也符合面向接口编程的思想。
*
* 观察者模式典型实现方式:
* 1、定义2个接口:观察者(通知)接口、被观察者(主题)接口
* 2、定义2个类,观察者对象实现观察者接口、主题类实现被观者接口
* 3、主题类注册自己需要通知的观察者
* 4、主题类某个业务逻辑发生时通知观察者对象,每个观察者执行自己的业务逻辑。
3.使用java中jdk的观察者模式来实现
3.1.四个观察者逻辑代码
public class ObserverRecord implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg + "-->开始记录日志");
}
public class ObserverData implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg + "-->开始存入数据库");
}
}
public class ObserverSendInfo implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg + "-->开始发送信息");
}
}
public class ObserverOther implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(arg + "-->开始其他一些操作");
}
}
3.2.被观察者,主题类逻辑代码
public class BuyTicket extends Observable {
/**
* 主题逻辑,购票
*/
public void buy() {
super.setChanged();
notifyObservers("购票成功!");
}
}
3.3.客服端测试
/**
* 测试借助jdk实现的观察者模式
*/
@Test
public void test1() {
BuyTicket buyTicket = new BuyTicket();
buyTicket.addObserver(new ObserverRecord());
buyTicket.addObserver(new ObserverData());
buyTicket.addObserver(new ObserverSendInfo());
buyTicket.addObserver(new ObserverOther());
buyTicket.buy();
}
购票成功!-->开始其他一些操作
购票成功!-->开始发送信息
购票成功!-->开始存入数据库
购票成功!-->开始记录日志
4.自己模拟实现观察者模式
4.1 观察者接口和几个观察者逻辑实现
public interface MyObserver {
// 得到通知后调用的方法
public void onBuyTicketOver(MyObserver observerTicket, String args);
}
public class MyObserverRecord implements MyObserver {
@Override
public void onBuyTicketOver(MyObserver observerTicket, String args) {
System.out.println(args + "-->开始记录日志");
}
}
public class MyObserverData implements MyObserver {
@Override
public void onBuyTicketOver(MyObserver observerTicket, String args) {
System.out.println(args + "-->开始存入数据库");
}
}
public class MyObserverSendInfo implements MyObserver {
@Override
public void onBuyTicketOver(MyObserver observerTicket, String args) {
System.out.println(args + "-->开始发送信息");
}
}
public class MyObserverOther implements MyObserver {
@Override
public void onBuyTicketOver(MyObserver observerTicket, String args) {
System.out.println(args + "-->开始其他一些操作");
}
}
4.2.被观察者接口机主题类的实现
public interface MyObservable {
// 提供注册观察者方法
public void addObserver(MyObserver myObserver);
}
public class MyBuyTicket implements MyObservable {
private List<MyObserver> observerTicketList = new ArrayList<MyObserver>();
// 添加观察者
@Override
public void addObserver(MyObserver observerTicket) {
observerTicketList.add(observerTicket);
}
// 购票
public void buyTicket(String ticket) {
// 1.购票逻辑,处理购票流程
// 2.购票成功后, 循环通知,调用其onBuyTicketOver实现不同业务逻辑
for (MyObserver observerTicket : observerTicketList) {
observerTicket.onBuyTicketOver(observerTicket, ticket);
}
}
}
4.3 客户端测试
/**
* 测试自己模拟实现的观察者模式
*/
@Test
public void test2() {
MyBuyTicket myBuyTicket = new MyBuyTicket();
myBuyTicket.addObserver(new MyObserverRecord());
myBuyTicket.addObserver(new MyObserverData());
myBuyTicket.addObserver(new MyObserverSendInfo());
myBuyTicket.addObserver(new MyObserverOther());
myBuyTicket.buyTicket("购票成功!");
}
购票成功!-->开始记录日志
购票成功!-->开始存入数据库
购票成功!-->开始发送信息
购票成功!-->开始其他一些操作