在软件开发中,我们经常会遇到对象间复杂的交互和职责分配问题。行为型模式就是为解决这类问题而生的设计模式,它主要关注对象之间的通信机制和职责划分。与创建型模式关注对象创建、结构型模式关注对象组合不同,行为型模式更注重对象间的协作方式。
行为型模式的核心价值在于:它提供了一套经过验证的解决方案,能够优雅地处理对象间的交互逻辑,使系统更灵活、更易于维护。在实际项目中,合理运用行为型模式可以显著降低模块间的耦合度,提高代码的可复用性和可扩展性。
策略模式(Strategy Pattern)定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。
策略模式包含三个核心角色:
java复制// 抽象策略接口
public interface PaymentStrategy {
void pay(int amount);
}
// 具体策略类
public class CreditCardPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用信用卡支付:" + amount + "元");
}
}
public class AlipayPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用支付宝支付:" + amount + "元");
}
}
// 环境类
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(int amount) {
strategy.pay(amount);
}
}
策略模式特别适用于以下场景:
实际开发中的典型应用:
优点:
缺点:
提示:当策略算法很复杂时,可以考虑使用策略模式配合模板方法模式,将算法的可变部分分离出来。
观察者模式(Observer Pattern)定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式包含以下角色:
java复制// 观察者接口
public interface Observer {
void update(String message);
}
// 具体观察者
public class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到消息: " + message);
}
}
// 目标接口
public interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
// 具体目标
public class NewsPublisher implements Subject {
private List<Observer> observers = new ArrayList<>();
private String news;
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer o : observers) {
o.update(news);
}
}
public void setNews(String news) {
this.news = news;
notifyObservers();
}
}
观察者模式在实际开发中有广泛应用:
在实际开发中,观察者模式有多种实现方式:
推模型 vs 拉模型:
线程安全问题:
Java内置支持:
注意:在实现观察者模式时,要特别注意避免观察者更新过程中又触发通知,导致无限循环的问题。
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
责任链模式主要角色:
java复制// 抽象处理者
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
// 具体处理者
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(int request) {
if (request < 10) {
System.out.println("HandlerA处理请求:" + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("HandlerB处理请求:" + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
责任链模式的典型应用包括:
纯与不纯的责任链模式:
责任链构建方式:
性能考虑:
与组合模式结合:
提示:在实现责任链模式时,可以考虑使用建造者模式来构建责任链,使链的构建更加灵活和可配置。
在实际项目中选择合适的行为型模式时,需要考虑以下因素:
对象间交互的复杂性:
算法变化频率:
系统扩展需求:
性能要求:
在实际项目中,常常需要组合使用多种设计模式:
策略模式+工厂模式:
观察者模式+中介者模式:
责任链模式+命令模式:
不要过度设计:
保持模式纯粹性:
文档和命名:
性能监控:
在实际项目中,我经常发现开发者在初期倾向于过度使用设计模式,而在后期又倾向于完全不用模式。这两种极端都需要避免。正确的做法是根据实际需求和变化点,合理选择和应用设计模式。