介绍下策略模式和观察者模式
策略模式,我记得它主要关注的是算法的封装,让算法可以独立于使用它的客户端变化。比如,有一个上下文类,里面有一个策略接口,然后不同的具体策略实现这个接口,这样上下文可以在运行时切换不同的策略。应用场景可能像排序算法,不同的排序策略可以随时替换。比如Java中的Comparator接口,用户可以通过实现这个接口来定义不同的比较策略,然后传递给Collections.sort方法。
然后是观察者模式,它处理的是对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知并自动更新。比如,事件处理系统,或者MVC中的模型和视图的关系。观察者模式通常有一个主题(Subject)接口,维护一个观察者列表,提供注册和删除的方法,还有通知的方法。观察者接口则有一个更新方法。当主题的状态变化时,调用通知方法,遍历所有观察者并调用他们的更新方法。Java中的事件监听机制,比如Swing中的ActionListener就是观察者模式的应用。
接下来需要组织这些信息,按照用户的要求结构清晰,分步骤介绍。可能需要先分别介绍每个模式,然后比较它们的区别,或者给出例子。注意使用中文,并且行内公式要用$...$,独立公式用$$...$$,不过这里可能公式用的不多,但如果有数学表达式需要注意格式。
需要检查是否有不正确的地方,比如策略模式是否真的是关于算法替换,观察者模式是否正确的描述了一对多的关系。同时,要确保例子恰当,没有混淆两种模式。比如策略模式强调替换不同的行为,而观察者模式强调通知机制。
可能还需要提到两种模式的UML结构,但用户没有特别要求,可能简要带过。重点在于让用户理解两者的用途和区别。另外,要确保语言通俗易懂,避免过于技术化的术语,但因为是设计模式,适当使用术语是必要的。
最后,总结两者的应用场景和优势,帮助用户理解何时使用哪种模式。比如策略模式在需要灵活切换算法时使用,观察者模式在需要解耦观察者和被观察者时使用。同时,可能提到它们都属于行为型模式,但解决的问题不同。### 策略模式与观察者模式详解
一、策略模式(Strategy Pattern)
核心思想
策略模式通过定义一系列算法族,将每个算法封装成独立类,使其可以相互替换。算法的变化独立于使用它的客户端。结构组成
- 策略接口:声明算法方法(例如:
Strategy
接口定义execute()
方法)。 - 具体策略类:实现接口,提供具体算法(例如:
ConcreteStrategyA
、ConcreteStrategyB
)。 - 上下文类:持有策略接口的引用,负责调用具体策略(例如:
Context
类通过setStrategy()
动态切换策略)。
- 策略接口:声明算法方法(例如:
应用场景
- 需要动态切换算法(如排序、支付方式选择)。
- 避免使用多重条件判断(例如:用策略模式替代
if-else
分支)。
代码示例
// 策略接口 interface SortingStrategy { void sort(int[] data); } // 具体策略:快速排序 class QuickSort implements SortingStrategy { public void sort(int[] data) { /* 实现快速排序 */ } } // 上下文类 class Sorter { private SortingStrategy strategy; public void setStrategy(SortingStrategy strategy) { this.strategy = strategy; } public void executeSort(int[] data) { strategy.sort(data); } }
优点与不足
- ✅ 算法可复用,扩展性强。
- ❌ 策略类数量可能过多,需权衡设计复杂度。
二、观察者模式(Observer Pattern)
核心思想
观察者模式定义对象间的一对多依赖关系,当一个对象(被观察者)状态变化时,所有依赖它的对象(观察者)自动收到通知并更新。结构组成
- 主题(Subject):维护观察者列表,提供注册/注销方法(如
addObserver()
、notifyObservers()
)。 - 观察者接口:定义更新方法(如
update(String message)
)。 - 具体观察者:实现接口,定义收到通知后的具体行为。
- 主题(Subject):维护观察者列表,提供注册/注销方法(如
应用场景
- 事件驱动系统(如GUI按钮点击事件)。
- 解耦数据与UI(如MVC架构中模型与视图的交互)。
代码示例
// 主题接口 interface Subject { void registerObserver(Observer o); void notifyObservers(String message); } // 具体主题:新闻发布中心 class NewsAgency implements Subject { private List<Observer> observers = new ArrayList<>(); public void registerObserver(Observer o) { observers.add(o); } public void notifyObservers(String news) { for (Observer o : observers) o.update(news); } } // 观察者接口 interface Observer { void update(String message); } // 具体观察者:用户订阅 class User implements Observer { public void update(String news) { System.out.println("收到新闻:" + news); } }
优点与不足
- ✅ 降低耦合度,支持广播通信。
- ❌ 观察者过多时可能影响性能。
三、两种模式对比
维度 | 策略模式 | 观察者模式 |
---|---|---|
关注点 | 算法的灵活替换 | 状态变化的通知与响应 |
关系类型 | 客户端主动选择策略 | 被观察者被动通知观察者 |
交互方向 | 单向(上下文调用策略) | 双向(主题与观察者相互依赖) |
典型应用 | 支付方式、排序算法切换 | 事件处理、实时数据更新 |
四、如何选择?
- 需动态修改行为时(如切换算法):选策略模式。
- 需解耦事件发布与订阅时(如状态更新):选观察者模式。
相关推荐
















