设计模式之 观察者模式

观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

观察者模式也叫发布订阅模式,她主要是用来解决通知问题的,为了保证系统的高度协同,同时还要低耦合,这时我们就可以使用观察者模式。

比如说:现在我在博客园发了一篇文章,什么人会看到我发的文章呢?第一种就是搜索了,通过搜索引擎找到,还有就是关注我,这样我就可以查询关注我的人,然后一个一个通知他们我发送了一篇文章。至于关注我的人会不会去阅读我就不太清楚了。

在我们开发项目的过程中,通常会遇到:如果记录被修改了,我应该怎么怎么办。我们会在一个业务类中引入其他业务类,然后修改记录后就调用其他的业务类。比如说,如果用户下单购买了一件物品,我们会调用短信接口通知商家、向客户发送一条购买成功的系统通知、更新购物车等等。如果我们在下单的业务类中引入一堆处理短信的业务类、发送系统通知的业务类等等操作,就会使业务逻辑变得复杂起来,如果还需要添加其他的操作,就会使得下单的逻辑和其他业务紧紧关联在一起,不利于扩展。

这时我们就可以使用观察者模式来改造这个业务。

我们先来看下 类图

image-20201205004012998

我们试着来使用代码来实现处理逻辑

package observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 下单操作,下单主题
 */
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("购物车处理:你的订单下单失败");
    }
}

/**
 * 观察者模式:
 * 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
 *
 * @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();

    }
}

// 输出结果
短信发送:你的订单下单成功
发送系统消息:你的订单下单成功
购物车处理:你的订单下单成功
posted @ 2020-12-06 23:40  喵喵扑  阅读(114)  评论(0编辑  收藏  举报