使用策略模式实现报警服务示例详解(短信报警)


在策略模式中,我们定义一系列的算法,把它们一个个封装起来,并使它们可相互替换。此模式让算法的变化独立于使用算法的客户。以下是一个使用策略模式实现短信报警服务的示例详解。

### 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`类和其他使用报警服务的客户端代码。