观察者模式

观察者模式

相信大家在日常生活中一定会遇到这样的场景:逛某宝的时候,商品没货了,或者价格太高了。会有一个到货通知、降价通知的模式。这就是“观察者模式”,其中商品就是被观察者,用户就是观察者。它是一种通知机制,在“被观察者”产生变动时,“观察者”可以感知到变动并做出相应的操作。

观察者模式也称为“发布-订阅模式”(Publish-Subscribe:Pub/Sub)。在观察者模式中有两类称呼进行对应。

  • 观察者-被观察者(Observer-Subject)
  • 发布-订阅(Publish-Subscribe)

在本文中以便混乱我们规定一下叫法,我们选择“观察者-被观察者(Observer-Subject)”这个称呼。

针对上文提到的场景。
首先我们先定义被观察者接口:

public interface ISubject {
    // 观察者列表
    List<IObserver> observerList = new ArrayList<>();

    default void addObserver(IObserver observer) {
        observerList.add(observer);
    }

    default void removeObserver(IObserver observer) {
        observerList.remove(observer);
    }

    default void notifyObserver(String message) {
        for (IObserver observer : observerList) {
            observer.update(message);
        }
    }
}

定义具体的被观察者---商品:

public class CommoditySubject implements ISubject {
    // 商品上架之后通知观察者
    public void online() {
        notifyObserver("商品上架了,快速购买吧");
    }

    // 商品上架之后通知观察者
    public void reduce() {
        notifyObserver("商家降价,快速购买吧");
    }
}

定义抽象的观察者:

public interface IObserver {
    // 收到通知,之后的处理逻辑
    void update(String message);
}

定义具体的观察者---用户:

public class UserObserver implements IObserver {

    private String userName;

    public UserObserver(String userName) {
        this.userName = userName;
    }

    @Override
    public void update(String message) {
        System.out.println(String.format("%s 被通知: %s", this.userName, message));
    }
}

代码定义之后,我们通过Client执行:

public class Client {
    public static void main(String[] args) {
        CommoditySubject commoditySubject = new CommoditySubject();
        // 添加观察者
        commoditySubject.addObserver(new UserObserver("张三"));
        // 添加观察者
        commoditySubject.addObserver(new UserObserver("李四"));
        // 添加观察者
        commoditySubject.addObserver(new UserObserver("王宇"));

        // 商品上架
        commoditySubject.online();

        // 商品降价
        commoditySubject.reduce();
    }
}

/***输出内容如下*******/
张三 被通知: 商品上架了,快速购买吧
李四 被通知: 商品上架了,快速购买吧
王宇 被通知: 商品上架了,快速购买吧
张三 被通知: 商家降价,快速购买吧
李四 被通知: 商家降价,快速购买吧
王宇 被通知: 商家降价,快速购买吧

通过代码,我们可以看出来,当“被观察者”变动之后,“观察者”就可以收到变动消息,从而做出相应的处理逻辑。并且对于扩展非常方便,如果此时我们新增其他类型的观察者,只需实现 IObserver 即可。

对于有兴趣的同学,可以添加其他类型的观察者,如SystemObserver。

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 1 评论
分享
牛客网
牛客企业服务