设计模式之策略模式
定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换。
这就是策略模式的定义,转换下概念,定义了一系列的类,并将每一个类的实现封装起来,使他们可以随调用者使用。
凡是用到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,对于这两个具体动作并不会屏蔽,相反还会让调用者去选择。
总结
如果有一系列的操作供调用者选择,那么就可以封装对应的操作类,同时提供一个操作入口给调用者放入。