设计模式之观察者模式
观察者模式概述
观察者模式(Observer Pattern) 是一种行为型设计模式,它主要用于创建对象之间的一对多依赖关系。这种模式允许一个目标对象(被观察对象)在状态发生变化时,通知所有依赖于它的观察者对象,从而使得这些观察者能够自动更新。
观察者模式的组成结构
Subject(目标对象) :在观察者模式中,目标对象负责维护观察者列表,并提供添加、删除观察者的方法。同时,它还负责通知所有观察者对象状态的变化。
Observer(观察者) :观察者是一个接口,它定义了一个更新方法(update),用于在目标对象状态改变时接收通知。
ConcreteObserver(具体观察者) :具体观察者实现了观察者接口,并对更新方法进行具体实现。当接收到目标对象的通知时,它会根据通知内容执行相应的操作。
观察者模式的应用示例
假设我们需要设计一个系统,当客户完成下单操作后,系统不仅需要返回交易状态,还需要通过短信和邮件的方式通知客户下单成功。以下是使用Java实现的观察者模式示例代码:
/**
*消息信息类
*/
@Data
@ToString
public class MsgInfo {
private String msg;
private String phone;
private String email;
}
//观察者抽象类
public interface MsgObserver {
void update(MsgInfo msgInfo);
}
//邮件观察者实现类
public class EmailMsgObserver implements MsgObserver {
@Override
public void update(MsgInfo msgInfo) {
System.out.println("EmailMsgObserver: " + msgInfo.getMsg());
System.out.println("email sent successfully");
}
}
//短信观察者实现类
public class PhoneObserver implements MsgObserver{
@Override
public void update(MsgInfo msgInfo) {
System.out.println("PhoneObserver: " + msgInfo.getMsg());
System.out.println("phone send successfully");
}
}
//目标对象
public class Subject {
List<MsgObserver> observers = new ArrayList<>();
//注册观察者
public void registerObserver(MsgObserver observer) {
observers.add(observer);
}
//删除观察者
public void removeObserver(MsgObserver observer) {
observers.remove(observer);
}
//通知观察者
public void notifyObservers(MsgInfo msg) {
for (MsgObserver observer : observers) {
observer.update(msg);
}
}
}
//下单操作
public class TradeSubject extends Subject {
public boolean PlaceOrder(){
System.out.println("Place order successfully!");
MsgInfo msgInfo = new MsgInfo();
msgInfo.setMsg("客户你好,您在平台下单已被受理,请耐心等待交易结果。");
msgInfo.setPhone("13800138000");
msgInfo.setEmail("13800138000@qq.com");
notifyObservers(msgInfo);
return true;
}
}
//测试
public class TestSubject {
public static void main(String[] args) {
TradeSubject subject = new TradeSubject();
MsgObserver ob1 = new EmailMsgObserver();
MsgObserver ob2 = new PhoneObserver();
subject.registerObserver(ob1);
subject.registerObserver(ob2);
subject.PlaceOrder();
}
}
观察者模式的适用场景与优缺点
适用场景:观察者模式适用于对象之间的多对多关系,尤其是在一个对象状态的改变需要同时改变其他对象状态时。
优点:
- 解耦:观察者模式实现了观察目标与观察者之间的松耦合,它们可以独立地改变和复用。
- 扩展性:增加新的观察者不会影响已有的观察者或观察目标,符合开闭原则。
- 抽象性:观察者模式提供了一种抽象的方式来处理对象之间的交互,使得系统更加灵活。
缺点:
- 性能开销:如果一个目标对象有大量的观察者,通知所有观察者可能会造成性能问题。
- 循环依赖:观察者和目标对象之间可能存在循环依赖,这可能导致难以追踪的问题。
转载自:https://juejin.cn/post/7352769502173233167