优雅的使用设计模式进行优化多重IF代码

概述

前面的博文说了,我现在想写一个IM APP,所以就直接开始编写了一些业务代码。首先,我的思路是客户端先通过 WS(WebSocket)链接到后端,再通过后端做消息中转。

那么一般的,在发送消息的时候,不可能只有一种固定的消息,消息与消息之间一定有区分的。比如客户端现在想发送一个 “申请好友” 消息,亦或者 “拒绝好友” 消息。那么不可避免的将遇到多重IF的问题之中。

Snipaste_2020-11-14_17-06-24.png

本质上来说这样的代码并没有问题,但是非常的丑陋,所以我想要尝试使用一些设计模式去解决这个问题。

代码

首先先把我们的业务代码设计为一个接口。

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