吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 904|回复: 5
收起左侧

[求助] 如何优化代码?

[复制链接]
黄色土豆 发表于 2024-3-4 14:55
本帖最后由 黄色土豆 于 2024-3-4 14:56 编辑

我现在知道可以使用工厂模式,替代 if else ;如果一个变量的获取的话,可以使用Map实现,现在是两个变量获取的话,使用工厂模式怎么实现?
[Java] 纯文本查看 复制代码
    private void getDmPacket(int contentType, DmPacketPayload packetPayload) {
        if (contentType == CLIENT_VERSION.getValue() && "7.1.5.186".equals(DmVersion.getVersion())) {
            new DmVersionResponsePacket_7_1_5_186().write(packetPayload);
        } else if (contentType == LOGIN.getValue() && "7.1.5.186".equals(DmVersion.getVersion())) {
            new DmLoginResponsePacket_7_1_5_186().write(packetPayload);
        } else if (contentType == CLIENT_VERSION.getValue() && "8.1.3.26".equals(DmVersion.getVersion())) {
            new DmVersionResponsePacket_8_1_3_26().write(packetPayload);
        } else if (contentType == LOGIN.getValue() && "8.1.3.26".equals(DmVersion.getVersion())) {
            new DmLoginResponsePacket_8_1_3_26().write(packetPayload);
        }
    }

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

海是倒过来的天 发表于 2024-3-4 15:26
本帖最后由 海是倒过来的天 于 2024-3-4 15:31 编辑

public interface DmPacket {
void write(DmPacketPayload packetPayload);
}

public class DmVersionResponsePacket_7_1_5_186 implements DmPacket {
@Override
public void write(DmPacketPayload packetPayload) {
// 实现你的逻辑
}
}  

public class DmLoginResponsePacket_7_1_5_186 implements DmPacket {
@Override
public void write(DmPacketPayload packetPayload) {
// 实现你的逻辑
}
}  

public class DmVersionResponsePacket_8_1_3_26 implements DmPacket {
@Override
public void write(DmPacketPayload packetPayload) {
// 实现你的逻辑
}
}  

public class DmLoginResponsePacket_8_1_3_26 implements DmPacket {
@Override
public void write(DmPacketPayload packetPayload) {
// 实现你的逻辑
}
}

public class DmPacketFactory {
private static final Map<Integer, Map<String, DmPacket>> PACKET_MAP = new HashMap<>();  

static {  
    // 初始化 map  
    Map<String, DmPacket> version7_1_5_186Packets = new HashMap<>();  
    version7_1_5_186Packets.put(CLIENT_VERSION.getValue(), new DmVersionResponsePacket_7_1_5_186());  
    version7_1_5_186Packets.put(LOGIN.getValue(), new DmLoginResponsePacket_7_1_5_186());  
    PACKET_MAP.put("7.1.5.186", version7_1_5_186Packets);  

    Map<String, DmPacket> version8_1_3_26Packets = new HashMap<>();  
    version8_1_3_26Packets.put(CLIENT_VERSION.getValue(), new DmVersionResponsePacket_8_1_3_26());  
    version8_1_3_26Packets.put(LOGIN.getValue(), new DmLoginResponsePacket_8_1_3_26());  
    PACKET_MAP.put("8.1.3.26", version8_1_3_26Packets);  
}  

public static DmPacket getDmPacket(int contentType, String version) {  
    Map<String, DmPacket> versionPackets = PACKET_MAP.get(version);  
    if (versionPackets != null) {  
        return versionPackets.get(contentType);  
    }  
    return null; // 或者抛出异常  
}  

}

private void getDmPacket(int contentType, DmPacketPayload packetPayload) {
DmPacket dmPacket = DmPacketFactory.getDmPacket(contentType, DmVersion.getVersion());
if (dmPacket != null) {
dmPacket.write(packetPayload);
} else {
// 处理未找到对应包的情况
}
}

如果你需要添加新的 DmPacket 类,你只需要在工厂类中添加新的映射关系就可以了

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
黄色土豆 + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| 黄色土豆 发表于 2024-3-5 09:10
海是倒过来的天 发表于 2024-3-4 15:26
[md]public interface DmPacket {  
    void write(DmPacketPayload packetPayload);  
}

谢谢,明白了
TR小米哥 发表于 2024-3-5 10:05
本帖最后由 TR小米哥 于 2024-3-5 10:07 编辑

要不定义一个工厂类,根据给定的contentTypeversion创建相应的对象

public class DmPacketFactory {
    public static DmResponsePacket createPacket(int contentType, String version) {
        if (contentType == CLIENT_VERSION.getValue()) {
            if ("7.1.5.186".equals(version)) {
                return new DmVersionResponsePacket_7_1_5_186();
            } else if ("8.1.3.26".equals(version)) {
                return new DmVersionResponsePacket_8_1_3_26();
            }
        } else if (contentType == LOGIN.getValue()) {
            if ("7.1.5.186".equals(version)) {
                return new DmLoginResponsePacket_7_1_5_186();
            } else if ("8.1.3.26".equals(version)) {
                return new DmLoginResponsePacket_8_1_3_26();
            }
        }
        return null; // 或者抛出异常,视情况而定
    }
}
baichenyi 发表于 2024-3-5 10:31
您可以优化代码以减少重复的条件检查。您可以将相同条件的检查合并在一起,如下所示:
[Java] 纯文本查看 复制代码
private void getDmPacket(int contentType, DmPacketPayload packetPayload) {
    String version = DmVersion.getVersion();
    if ("7.1.5.186".equals(version)) {
        if (contentType == CLIENT_VERSION.getValue()) {
            new DmVersionResponsePacket_7_1_5_186().write(packetPayload);
        } else if (contentType == LOGIN.getValue()) {
            new DmLoginResponsePacket_7_1_5_186().write(packetPayload);
        }
    } else if ("8.1.3.26".equals(version)) {
        if (contentType == CLIENT_VERSION.getValue()) {
            new DmVersionResponsePacket_8_1_3_26().write(packetPayload);
        } else if (contentType == LOGIN.getValue()) {
            new DmLoginResponsePacket_8_1_3_26().write(packetPayload);
        }
    }
}

通过这种方式,您可以避免重复检查相同的条件,并且代码更易读和易维护。
elonlo 发表于 2024-3-5 10:51
策略模式加枚举
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表