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);
            }
        }
    }
}

优势

  1. 通过策略模式,在调用入口处,避免了if...else if... else...的编写
  2. 在后续增加企业微信通知功能时,对调用入口无侵入,只需按照实现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顺滑!