likes
comments
collection
share

设计模式之观察者模式

作者站长头像
站长
· 阅读数 27

观察者模式概述

观察者模式(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();
    }
}

观察者模式的适用场景与优缺点

适用场景:观察者模式适用于对象之间的多对多关系,尤其是在一个对象状态的改变需要同时改变其他对象状态时。

优点

  1. 解耦:观察者模式实现了观察目标与观察者之间的松耦合,它们可以独立地改变和复用。
  2. 扩展性:增加新的观察者不会影响已有的观察者或观察目标,符合开闭原则。
  3. 抽象性:观察者模式提供了一种抽象的方式来处理对象之间的交互,使得系统更加灵活。

缺点

  1. 性能开销:如果一个目标对象有大量的观察者,通知所有观察者可能会造成性能问题。
  2. 循环依赖:观察者和目标对象之间可能存在循环依赖,这可能导致难以追踪的问题。
转载自:https://juejin.cn/post/7352769502173233167
评论
请登录