概述
前面的博文说了,我现在想写一个IM APP,所以就直接开始编写了一些业务代码。首先,我的思路是客户端先通过 WS(WebSocket)链接到后端,再通过后端做消息中转。
那么一般的,在发送消息的时候,不可能只有一种固定的消息,消息与消息之间一定有区分的。比如客户端现在想发送一个 “申请好友” 消息,亦或者 “拒绝好友” 消息。那么不可避免的将遇到多重IF的问题之中。
本质上来说这样的代码并没有问题,但是非常的丑陋,所以我想要尝试使用一些设计模式去解决这个问题。
代码
首先先把我们的业务代码设计为一个接口。
public interface MessageOperation {
void apply(String userId, Message msg);
}
然后再去实现它的不同的消息处理类。
public class AddFriendImpl implements MessageOperation {
public class SendMessageImpl implements MessageOperation {
创建工厂类将其注册进去。
public class MessageOperationFactory {
static Map<String,MessageOperation> operationMap = new HashMap<>();
static {
operationMap.put("AddFriend",new AddFriendImpl());
operationMap.put("SendMessageImpl",new SendMessageImpl());
}
public static MessageOperation getOperation(String type){
return operationMap.get(type);
}
}
应用。
MessageOperation operation = MessageOperationFactory.getOperation(message.getType());
operation.apply(userId,message);
优化
以上已完全的叙述了整体代码流程,但我们每次添加一个类还是需要去工厂类中添加代码,如果使用Spring的话可以将其自动注入工厂中。
将抽象类继承 InitializingBean,并在子类实现 afterPropertiesSet 方法。当这个类被Spring初始化的时候就会自动去执行这个方法。不过要记得给这个类加一个@Component注解~
在工厂类中加入注册方法。
public static void registerOperation(String name,MessageOperation mo){
if (!StringUtils.isEmpty(name) && mo != null){
operationMap.put(name,mo);
}
}
应用。
@Override
public void afterPropertiesSet() throws Exception {
MessageOperationFactory.registerOperation("AddFriend",this);
}
本页的评论功能已关闭