设计模式(三) 策略模式

借用设计模式(二)中的案例

问题分析

  • 在Demo中部分代码
    /**
     * 重置密码方法
     */
    public void resetPassword() {
        String smsType = "huawei";
        sendCodeSMS(smsType, new HashMap<>());
    }

    public Map sendCodeSMS(String smsType, Map<String, String> paramMap) {
        if ("ali".equals(smsType)) {
            // TODO 可实现按照适配器命名规则, 利用反射初始化适配器
//            smsService = new AliSmsAdapter();
        } else if ("tencent".equals(smsType)) {
            // TODO 可实现按照适配器命名规则, 利用反射初始化适配器
//            smsService = new TencentSmsAdapter();
        } else if ("hauwei".equals(smsType)) {
            // TODO 可实现按照适配器命名规则, 利用反射初始化适配器
//            smsService = new HuaweiSmsAdapter();
        }
        return smsService.sendCodeSMS(paramMap);
    }
  • 如果此时系统中短信平台增加七牛云, 不仅要实现其七牛的Adapter, 而且还要在此处添加一个判断平台的判断,还是需要在调用方进行修改,程序还有优化的空间
  • 每一种平台,更像是一种策略,而策略的选用在调用时就能确定.

UML

此时Demo类对SmsService的依赖(原组合关系),转换为了Demo.getAdapterBySmsType()方法对SmsService的依赖(依赖关系)
在这里插入图片描述

修改后的Demo.java代码

public class Demo {
    /**
     * 注册方法
     */
    public void regist() {
        String smsType = "huawei";
        sendCodeSMS(getAdapterBySmsType(smsType), new HashMap<>());
    }

    /**
     * 重置密码方法
     */
    public void resetPassword() {
        String smsType = "huawei";
        sendCodeSMS(getAdapterBySmsType(smsType), new HashMap<>());
    }

    public Map sendCodeSMS(SmsService smsService, Map<String, String> paramMap) {
        return smsService.sendCodeSMS(paramMap);
    }

    private SmsService getAdapterBySmsType(String smsType) {
    	// 此时如果增加平台,只需要按照相同的规则定义七牛短信平台的Adapter即可使用
        // TODO 根据规则,选用策略逻辑
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值