概述
观察者模式(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中的事件处理也是观察者模式的应用,例如,你可以为按钮添加点击事件监听器,当按钮被点击时,监听器会收到通知。
这些只是一些例子,观察者模式在许多框架和应用中都有广泛的应用。它提供了一种松耦合的方式,允许不同部分的代码能够在发生变化时保持同步,从而实现更加灵活和可维护的程序。