文章目录
📋业务场景
最近有一个场景消息发送处理 跟大家分享一下我实现方式
- 发送消息就会涉及各种消息:图片消息,文字消息,视频消息等等…
- 每种消息的数据结构可能还不同,所以这里用了设计模式里面策略模式
📖策略模式的概念
策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为,而不是在编译时进行硬编码。该模式通过将算法封装到独立的类中,并使它们可以相互替换,从而实现了算法的独立变化和客户端的解耦。
- 以下是策略模式的参与者角色:
- 上下文(Context):它维护一个对策略对象的引用,并在需要执行某个特定行为时,将请求委托给相关的策略对象。
- 策略(Strategy):它定义了一个公共接口,用于所有具体策略类的行为。上下文通过这个接口与具体策略类进行交互。
- 具体策略(Concrete Strategies):它实现了策略接口,并提供了具体的算法实现
🔖代码示例
1️⃣创建一个接口类
/**
* @Author: hrd
* @CreateTime: 2023/6/29 11:28
* @Description:
*/
public interface Message {
/**
* 消息类型
*
* @return
*/
int getMsgType();
void handle(MessageBody messageBody);
}
2️⃣创建接口类的实现类
/**
* @Author: hrd
* @CreateTime: 2023/6/29 11:36
* @Description:
*/
@Component
public class PicMessage implements Message{
@Override
public int getMsgType() {
return 2;
}
@Override
public void handle(MessageBody messageBody) {
System.out.println("正在处理图片消息...");
System.out.println("图片消息Json:"+messageBody.getMessage());
}
}
/**
* @Author: hrd
* @CreateTime: 2023/6/29 11:30
* @Description:
*/
@Component
public class TxtMessage implements Message{
@Override
public int getMsgType() {
return 1;
}
@Override
public void handle(MessageBody messageBody) {
System.out.println("正在处理文字消息...");
System.out.println("文字消息Json:"+messageBody.getMessage());
}
}
3️⃣创建脚手架 box类
/**
* @Author: hrd
* @CreateTime: 2023/6/29 11:39
* @Description:
*/
public class MsgHandleBox {
private final Map<Integer, Message> map = new ConcurrentHashMap<>();
public void setBean(List<Message> messages) {
if (null != messages) {
messages.forEach(this::put);
}
}
private void put(Message message) {
if (null != message) {
map.put(message.getMsgType(), message);
}
}
public Message get(int msgType){
return map.get(msgType);
}
}
4️⃣最后创建一个实现工厂类 MsgBeanFactory
@Component
public class MsgBeanFactory extends MsgHandleBox {
@Autowired(required = false)
@Override
public void setBean(List<Message> messages) {
super.setBean(messages);
}
@Override
public Message get(int msgType) {
return super.get(msgType);
}
}
5️⃣测试代码
@SpringBootTest
class SpringbootBaseApplicationTests {
@Autowired
MsgBeanFactory msgBeanFactory;
@Test
void contextLoads() {
List<MessageBody> m = new ArrayList<MessageBody>(){{
add(new MessageBody("我是文字消息",1));
add(new MessageBody("{\"url\":\"图片地址\",\"size\":\"图片大小\"}",2));
}};
for (MessageBody messageBody : m) {
Message message = msgBeanFactory.get(messageBody.getType());
message.handle(messageBody);
}
}
}
/**
* @Author: hrd
* @CreateTime: 2023/6/29 11:32
* @Description:
*/
public class MessageBody {
private String message;
private int type;
public MessageBody(String message, int type) {
this.message = message;
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
6️⃣输出结果
正在处理文字消息...
文字消息Json:我是文字消息
正在处理图片消息...
图片消息Json:{"url":"图片地址","size":"图片大小"}
📈总结:
在上述示例中,
Message
是策略接口,PicMessage
和TxtMessage
是具体的策略类。MsgBeanFactory
是上下文类,在这里可以选择不同的策略来加密数据。这样,如果日后需要添加更多的消息类型,只需创建新的策略类即可,而不需要修改现有的代码。
- 优点:
- 1 可以自由切换对应处理逻辑
- 2 避免了大量的if判断,代码更加优雅了
- 3 扩展性更好,有新的消息类型只需增加对应的新消息类,需要修改外围逻辑
- 缺点
- 类增多,代码复杂度提升