0
点赞
收藏
分享

微信扫一扫

十二、观察者模式——你如果关心我就注册吧,我会把你放进名单中

文章目录


设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

行为型 包含了 观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、 访问者模式、备忘录模式、命令模式、解释器模式、中介模式 总共11种模式。

观察者模式

观察者模式(Observer Design Pattern) 也称为发布订阅模式,当观测对象发生状态变化时,依赖的对象会收到通知。

1.Subject

Subject 和 ConcreteSubject 是被观察者,提供了注册方法,void register(Observer o);,通过注册将观察者添加进列表,也提供了移除方法。
当发生状态变更时,就会通知所有观察者。

public interface Subject {
    void register(Observer o);
    void notify(Message message);
    void deregister(Observer o);
}

public class ConcreteSubject implements Subject{
    private List<Observer> observers = new ArrayList<>();

    @Override
    public void register(Observer o) {
        observers.add(o);
    }

    @Override
    public void notify(Message message) {
        for(Observer o:observers){
            o.update(message);
        }
    }

    @Override
    public void deregister(Observer o) {
        observers.remove(o);
    }
}

2. Observer

观察者提供一个update方法,以接收message,当被观察者发生状态改变时就会通知 Observer 。Observer接收到信息后进行对应的处理。

public interface Observer {
    void update(Message msg);
}

public class ConcreteObserver1 implements Observer{
    @Override
    public void update(Message msg) {
        System.out.println("DB saved "+ msg);
    }
}

public class ConcreteObserver2 implements Observer{
    @Override
    public void update(Message msg) {
        System.out.println("Log saved "+ msg);
    }
}

3. Main

public class Main {
    public static void main(String[] args) {
        Subject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver1();
        Observer observer2 = new ConcreteObserver2();
        subject.register(observer1);
        subject.register(observer2);
        subject.notify(new Message("200","成功"));
    }
}

运行结果:

DB saved Message{code='200', content='成功'}
Log saved Message{code='200', content='成功'}

总结

观察者模式可以用于对业务处理逻辑的解耦,当某个方法或状态变化后,触发notify方法,将通知所有观察者进行相应的处理。
比如登录后,就可以通知发送短信通知、开通权限、赠送积分等处理逻辑。

观察者作为一种行为模式,将观察者和被观察者之间的行为解耦。消息队列的设计思路就是观察者模式,将系统和逻辑进行了解耦。

设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

举报

相关推荐

0 条评论