在策略模式中,我们定义一系列的算法,把它们一个个封装起来,并使它们可相互替换。此模式让算法的变化独立于使用算法的客户。以下是一个使用策略模式实现短信报警服务的示例详解。
### 1. 定义报警策略接口
首先,我们需要定义一个报警策略的接口,所有的报警方式(如短信、邮件等)都需要实现这个接口。
public interface AlarmStrategy {
void alert(String message);
}
### 2. 实现短信报警策略
接着,我们实现短信报警策略,即实现`AlarmStrategy`接口。
public class SmsAlarmStrategy implements AlarmStrategy {
@Override
public void alert(String message) {
System.out.println("Sending SMS Alert: " + message);
// 这里可以添加实际的短信发送逻辑
}
}
### 3. 上下文(Context)类
上下文类维护对策略对象的引用,并可以在运行时更改策略。在报警服务中,上下文类可以是报警服务管理类。
public class AlarmService {
private AlarmStrategy strategy;
public AlarmService(AlarmStrategy strategy) {
this.strategy = strategy;
}
// 允许在运行时更改策略
public void setStrategy(AlarmStrategy strategy) {
this.strategy = strategy;
}
// 触发报警
public void triggerAlarm(String message) {
strategy.alert(message);
}
}
### 4. 客户端代码
最后,客户端代码根据需要选择合适的报警策略,并触发报警。
public class Client {
public static void main(String[] args) {
// 创建短信报警策略
AlarmStrategy smsStrategy = new SmsAlarmStrategy();
// 创建报警服务并设置短信报警策略
AlarmService alarmService = new AlarmService(smsStrategy);
// 触发报警
alarmService.triggerAlarm("Temperature is too high, please check!");
// 假设我们需要更改报警策略为邮件报警(这里只是演示,实际中需要邮件报警策略的实现)
// AlarmStrategy emailStrategy = new EmailAlarmStrategy(); // 假设存在EmailAlarmStrategy类
// alarmService.setStrategy(emailStrategy);
// alarmService.triggerAlarm("Another important alert");
}
}
### 详解
- **策略接口**:`AlarmStrategy`定义了一个`alert`方法,所有的报警策略都需要实现这个方法。
- **短信报警策略**:`SmsAlarmStrategy`实现了`AlarmStrategy`接口,提供了具体的短信报警逻辑。
- **上下文类**:`AlarmService`维护了对`AlarmStrategy`的引用,并提供了一个`triggerAlarm`方法来触发报警。它还允许在运行时更改报警策略。
- **客户端**:客户端代码创建了短信报警策略,并将其设置到报警服务中,然后触发了报警。如果需要更改报警方式,只需更换策略即可。
这种设计使得新增或修改报警方式变得非常灵活,无需修改`AlarmService`类和其他使用报警服务的客户端代码。