观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式也叫发布订阅模式,她主要是用来解决通知问题的,为了保证系统的高度协同,同时还要低耦合,这时我们就可以使用观察者模式。
比如说:现在我在博客园发了一篇文章,什么人会看到我发的文章呢?第一种就是搜索了,通过搜索引擎找到,还有就是关注我,这样我就可以查询关注我的人,然后一个一个通知他们我发送了一篇文章。至于关注我的人会不会去阅读我就不太清楚了。
在我们开发项目的过程中,通常会遇到:如果记录被修改了,我应该怎么怎么办。我们会在一个业务类中引入其他业务类,然后修改记录后就调用其他的业务类。比如说,如果用户下单购买了一件物品,我们会调用短信接口通知商家、向客户发送一条购买成功的系统通知、更新购物车等等。如果我们在下单的业务类中引入一堆处理短信的业务类、发送系统通知的业务类等等操作,就会使业务逻辑变得复杂起来,如果还需要添加其他的操作,就会使得下单的逻辑和其他业务紧紧关联在一起,不利于扩展。
这时我们就可以使用观察者模式来改造这个业务。
我们先来看下 类图
我们试着来使用代码来实现处理逻辑
package observer;
import java.util.ArrayList;
import java.util.List;
/**
* 观察者模式:
* 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
*
* @author lixin
*/
public class ObserverDemo {
public static void main(String[] args) {
PlaceAnOrderSubject subject = new PlaceAnOrderSubject();
new SmsPlaceAnOrderObserver(subject);
new SysMsgPlaceAnOrderObserver(subject);
new ShopCartPlaceAnOrderObserver(subject);
// 业务处理成功
subject.notifySuccess();
// 业务处理失败
//subject.notifyFail();
}
}
/**
* 下单操作,下单主题
*/
class PlaceAnOrderSubject {
private final List<AbstractPlaceAnOrderObserver> observers = new ArrayList<>();
/**
* 订单状态控制
*/
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
/**
* 注册
*
* @param observer 下单后处理类
*/
public void register(AbstractPlaceAnOrderObserver observer) {
observers.add(observer);
}
/**
* 注销
*
* @param observer 下单后处理类
*/
public void cancellation(AbstractPlaceAnOrderObserver observer) {
observers.remove(observer);
}
/**
* 下单成功通知已经注册的对象
*/
public void notifySuccess() {
for (AbstractPlaceAnOrderObserver observer : observers) {
observer.success();
}
}
/**
* 下单失败通知已经注册的对象
*/
public void notifyFail() {
for (AbstractPlaceAnOrderObserver observer : observers) {
observer.fail();
}
}
}
/**
* 下单后处理抽象类
*/
abstract class AbstractPlaceAnOrderObserver {
protected PlaceAnOrderSubject subject;
/**
* 成功通知
*/
public abstract void success();
/**
* 失败通知
*/
public abstract void fail();
}
/**
* 发送短信处理
*/
class SmsPlaceAnOrderObserver extends AbstractPlaceAnOrderObserver {
SmsPlaceAnOrderObserver(PlaceAnOrderSubject subject) {
this.subject = subject;
this.subject.register(this);
}
@Override
public void success() {
System.out.println("短信发送:你的订单下单成功");
}
@Override
public void fail() {
System.out.println("短信发送:你的订单下单失败");
}
}
/**
* 发送系统消息
*/
class SysMsgPlaceAnOrderObserver extends AbstractPlaceAnOrderObserver {
SysMsgPlaceAnOrderObserver(PlaceAnOrderSubject subject) {
this.subject = subject;
this.subject.register(this);
}
@Override
public void success() {
System.out.println("发送系统消息:你的订单下单成功");
}
@Override
public void fail() {
System.out.println("发送系统消息:你的订单下单失败");
}
}
/**
* 购物车处理
*/
class ShopCartPlaceAnOrderObserver extends AbstractPlaceAnOrderObserver {
ShopCartPlaceAnOrderObserver(PlaceAnOrderSubject subject) {
this.subject = subject;
this.subject.register(this);
}
@Override
public void success() {
System.out.println("购物车处理:你的订单下单成功");
}
@Override
public void fail() {
System.out.println("购物车处理:你的订单下单失败");
}
}