设计模式之策略模式

定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换。

这就是策略模式的定义,转换下概念,定义了一系列的类,并将每一个类的实现封装起来,使他们可以随调用者使用。

凡是用到if - else的条件判断,都可以考虑考虑是否可以使用策略模式。

假如有这么一个场景,用户可以选择发短信,也可以选择发邮件?这就是一个if - else 的判断。

那么按照策略模式定义,那就要定义两个类供用户使用。

public class MailService {
    public void send(String content) {
        System.out.println("邮件发送:"+content);
    }
}

public class SmsService {
    public void send(String toPhone, String content) {
        System.out.println("SmsService :" + content);
    }
}


//调用者
String toPhone = "12306";
String content = "hello world";

SmsService smsService = new SmsService();
MailService mailService = new MailService();

smsService.send(toPhone, content);
mailService.send(content);

如上所示,调用者确实可以选择是SmsService还是MailService,但是这就是策略模式了么?

我觉得他就是策略模式,提供了一些列操作供调用者去选择。

但是更多的时候,我们往往会提供一个统一的接口让调用者使用。

比如提供一个消息策略:

/**
 * @author lw
 * @date 2022/3/30 0030
 * @description  消息策略
 */
public class SenderStrategy {

    /**
     * 提供使用算法的地方
     * @param senderService
     * @param args
     */
    public void send(SenderService senderService,String ...args){
        senderService.send(args);
    }
}

在这里插入图片描述

调用者

		String toPhone = "12306";
        String content = "hello world";

        SmsService smsService = new SmsService();
        MailService mailService = new MailService();

        SenderStrategy senderStrategy = new SenderStrategy();
        senderStrategy.send(smsService,toPhone,content);
        senderStrategy.send(mailService,content);

比较一下这个SenderStrategy类和工厂类的区别,工厂类是屏蔽了SmsService和MailService,只返回一个SenderService给外部。

但是策略类却让调用者自己选择是SmsService还是MailService,对于这两个具体动作并不会屏蔽,相反还会让调用者去选择。

在这里插入图片描述

总结

如果有一系列的操作供调用者选择,那么就可以封装对应的操作类,同时提供一个操作入口给调用者放入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值