深入理解设计模式-行为型之观察者

概述

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象发生变化时,所有依赖于它的观察者对象都会得到通知并更新。

在观察者模式中,有两个主要角色:

  • Subject(主题):维护一个观察者列表,提供方法用于添加、删除和通知观察者。
  • Observer(观察者):定义一个接口,用于接收主题对象的通知,以便在主题发生变化时更新自身状态。

电商系统的应用

促销通知的例子:
假设我们有一个电商系统,当某件商品有促销活动时,需要通知所有订阅了该商品的用户。在这个例子中,商品是主题,用户是观察者

首先,我们创建一个Subject接口,表示主题:

public interface Subject {
    void registerObserver(Observer o);//添加
    void removeObserver(Observer o);//删除
    void notifyObservers();//通知
}

接下来,我们创建一个Observer接口,表示观察者:

public interface Observer {
    void update(String discountInfo);
}

现在,我们创建一个具体的主题,如Product,实现Subject接口:

public class Product implements Subject {
    private ArrayList<Observer> observers;
    
    // 折扣消息
    private String discountInfo;
    public Product() {
        observers = new ArrayList<>();
   }
    public void registerObserver(Observer o) {
        observers.add(o);
   }
    public void removeObserver(Observer o) {
        int index = observers.indexOf(o);
        if (index >= 0) {
            observers.remove(index);
       }
   }
    public void notifyObservers() {
        for (Observer o : observers) {
            o.update(discountInfo);
       }
   }
    public void discountChanged() {
        notifyObservers();
   }
    public void setDiscountInfo(String discountInfo) {
        this.discountInfo = discountInfo;
        discountChanged();
   }
}

接着,我们创建一个具体的观察者,如User,实现Observer接口:

public class User implements Observer {
    private String userName;
    private String discountInfo;
    private Subject product;
    public User(String userName, Subject product) {
        this.userName = userName;
        this.product = product;
        product.registerObserver(this);
   }
    public void update(String discountInfo) {
        this.discountInfo = discountInfo;
        display();
   }
    public void display() {
        System.out.println("用户 " + userName + " 收到促销通知: " + discountInfo);
   }
}

2个接口,2个具体的类。
现在我们可以创建一个Product实例(主题)并向其注册User观察者。当Product的促销信息发生变化时,User会收到通知并显示促销信息。

public class Main {
    public static void main(String[] args) {
 	  	//注册2个用户
        User user1 = new User("张三", product);
        User user2 = new User("李四", product);
        // 模拟商品促销信息更新
  		   Product product = new Product();
        product.setDiscountInfo("本周末满100减50");
        product.setDiscountInfo("双十一全场5折");
   }
}

在这个例子中,我们创建了一个Product实例并向其注册了两个User观察者。当Product的促销信息发生变化时,所有观察者都会收到通知并更新自己的显示。这个例子展示了观察者模式在电商系统中的应用,如何实现商品和用户之间的交互。

源码应用

观察者模式在许多Java框架和库中都有应用,以下是一些常见的示例:

  • Java 内置类库:Java内置了一些使用观察者模式的类,例如 java.util.Observable 和 java.util.Observer。虽然在较新的Java版本中已经不推荐使用,但它们仍然是观察者模式的一个例子。你可以通过扩展 Observable 类并实现 Observer 接口来创建自己的观察者模式。

  • Swing GUI 框架:Swing中的事件监听就是观察者模式的应用。比如,你可以为按钮添加动作监听器,当按钮被点击时,监听器会收到通知并执行相应的操作。

  • Spring Framework:Spring框架广泛使用观察者模式,特别是在事件驱动编程中。例如,Spring的事件机制允许你在应用中发布和监听事件,当某些事件发生时,注册的监听器会收到通知并执行相应的逻辑。

  • Android开发:Android中的事件处理也是观察者模式的应用,例如,你可以为按钮添加点击事件监听器,当按钮被点击时,监听器会收到通知。

这些只是一些例子,观察者模式在许多框架和应用中都有广泛的应用。它提供了一种松耦合的方式,允许不同部分的代码能够在发生变化时保持同步,从而实现更加灵活和可维护的程序。

你可能感兴趣的:(设计模式,设计模式,java,开发语言)