文章目录
设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。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、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。