CodingTechWork,一起学习进步。
需求
在开发过程中,我们可能有很多实现类,都是按照某种数据类型判断来进行不同类的操作。比如,在kafka
或者rocket mq
消费完数据后,我们需要根据数据类型进行不同数据操作。我们会怎么设计编码?
初级编码
介绍
大多数想法,就是增量if...else if...else...
示例
一个平台的通知消息的推送功能,可以通过粗暴的if...else...
进行操作。
通知接口
public interface MessageNotice {
/**
* 通知操作
*
* @param user
* @param content
*/
void notify(User user, String content);
}
短信通知实现
@Component
public class SMSMessageNotice implements MessageNotice {
@Override
public void notify(User user, String content) {
//调用短信通知的api,通知对应用户发送短信
}
}
邮件通知实现
@Component
public class EmailMessageNotice implements MessageNotice {
@Override
public void notify(User user, String content) {
//调用短信通知的api,通知对应用户发送邮件
}
}
消息通知调用入口
public class DemoTest{
@Resource
private SMSMessageNotice sMSMessageNotice;
@Resource
private EmailMessageNotice emailMessageNotice;
...
//通知入口
public void notifyMessage(User user, String content, int notifyType) {
if (notifyType == 0) {
//短信通知
sMSMessageNotice.notify(user, content)
} else if (notifyType == 1) {
//邮件通知
emailMessageNotice.notify(user, content)
}
}
...
}
策略模式
介绍
策略模式就是针对一组算法,将每一个算法封装到具有共同接口的独立类中,也就是给出一个接口或者抽象类A(类似于规范),其他类B、C、D实现或者继承A进行具体算法或行为的描述。
示例
一个平台的通知消息的推送功能,可以通过策略模式
进行操作。
通知接口
public interface MessageNotice {
/**
* 通知类型是否支持
*
* @param type 0:短信 1:邮件
* @return
*/
boolean support(int type);
/**
* 通知操作
*
* @param user
* @param content
*/
void notify(User user, String content);
}
短信通知实现
@Component
public class SMSMessageNotice implements MessageNotice {
@Override
public boolean support(int type) {
return type == 0;
}
@Override
public void notify(User user, String content) {
//调用短信通知的api,通知对应用户发送短信
}
}
邮件通知实现
@Component
public class EmailMessageNotice implements MessageNotice {
@Override
public boolean support(int type) {
return type == 1;
}
@Override
public void notify(User user, String content) {
//调用邮件通知的api,通知对应用户发送邮件
}
}
消息通知调用入口
public class DemoTest{
@Resource
private List<MessageNotice> messageNoticeList;
//通知入口
public void notifyMessage(User user, String content, int notifyType) {
for (MessageNotice messageNotice : messageNoticeList) {
if (messageNotice.support(notifyType)) {
//根据不同的notifyType进入不同的通知操作行为中
messageNotice.notify(user, content);
}
}
}
}
优势
- 通过策略模式,在调用入口处,避免了
if...else if... else...
的编写 - 在后续增加企业微信通知功能时,对调用入口无侵入,只需按照实现
MessageNotice
接口去增量实现类即可。
@Component
public class EnterpriseWeChatMessageNotice implements MessageNotice {
@Override
public boolean support(int type) {
return type == 2;
}
@Override
public void notify(User user, String content) {
//调用企业微信通知的api,通知对应用户发送邮件
}
}
so简单,so顺滑!