gpt4 book ai didi

java - Android - 在应用程序和 Jar 的 HashMap 中动态添加函数

转载 作者:行者123 更新时间:2023-11-30 11:42:47 24 4
gpt4 key购买 nike

您好,我有包装器应用程序和一个在包装器应用程序服务中运行的 jar。在完整的解决方案中,Jar 是我的产品,我不能对用户进行辱骂,但我需要通过针对从套接字接收的命令注册函数来让他们自由扩展功能。他们可以在包装器应用程序中完成。我已经有一些来自 flex UI 的命令,它们的处理方式如下:

    private void processCommand(String tempCommand) throws NumberFormatException, IOException, ELearningException 
{
ApplicationLog.log("Command Queue " + tempCommand, true);

String[] commandParameters = tempCommand.split("#");

switch (Integer.parseInt(commandParameters[0]))
{
case CONSTANTS.INITIALIZE:
if (this.m_isInitialized)
break;
else
{
InitializeTeacherJar.instantiate(tempCommand.split("#")[1], this.baseContext, tempCommand.split("#")[2]);

parent = InitializeTeacherJar.getInstance();

parent.setMyFlexServer(this.m_localServerSocket);
parent.setMyFlexSocket(this.m_localSocket);

this.m_isInitialized = true;
}
break;
case CONSTANTS.LOGIN:

/**
* Store student details in hash map
*/

this.writeToStudentJava(tempCommand, JavaServerThreadForTeacher.getIpAddress().getHostAddress());

if(tempCommand.split("#")[1].equalsIgnoreCase(CONSTANTS.SUCCESS))
{
HashMap<String, ArrayList<String>> temp = parent.getStudentIPList();
ArrayList<String> value= new ArrayList<String>();
value.add(tempCommand.split("#")[3]);
value.add("present");
temp.put(tempCommand.split("#")[2], value);
parent.setStudentIPList(temp);

if (StudentUtility.studentCounter < 0)
StudentUtility.studentCounter = 0;

StudentUtility.studentCounter = StudentUtility.studentCounter + 1;

parent.getMyFlexSocket().getOutputStream().write((CONSTANTS.PING + parent.getDelimiter() + StudentUtility.studentCounter).getBytes());

System.out.print("StudentUtility.studentCounter :: "+StudentUtility.studentCounter);
}
break;
case CONSTANTS.COURSE:
parent.setCourse(tempCommand.split(parent.getDelimiter())[1]);
break;
case CONSTANTS.ACTION:
parent.performAction(tempCommand, commandParameters[3]);

parent.getMyFlexSocket().getOutputStream().write((CONSTANTS.PING + parent.getDelimiter() + StudentUtility.studentCounter).getBytes());
break;

case CONSTANTS.INTERACTIVE:
if (commandParameters[1].equalsIgnoreCase(CONSTANTS.Play)) {
parent.playAudio(commandParameters[2], true);
} else if (commandParameters[1].equalsIgnoreCase(CONSTANTS.Record)) {
parent.startAudioRecording(commandParameters[2], true);
} else {
parent.playAudio(commandParameters[2], false);
}

case CONSTANTS.TTL:
this.m_isWifiConnected();
break;
case CONSTANTS.DELETE:
parent.deleteFile(commandParameters[1], true);
// deleteRecording(commandParameters[3],
// commandParameters[1]
// + commandParameters[2]);
// deleteEveryThing(Environment.getExternalStorageDirectory()
// .getAbsolutePath() + "/" + commandParameters[2]);
// deleteEveryThing(pathToSave + "/Response/" + course + "/"
// + commandParameters[1]);
break;
case CONSTANTS.RESTART:
StudentUtility.sendToEveryStudent(tempCommand);
StudentUtility.displayOnProjector(tempCommand);
parent.setStudentIPList(new HashMap<String, ArrayList<String>>());
parent.setCourse("");
break;
case CONSTANTS.EXIT:
StudentUtility.displayOnProjector(tempCommand);
StudentUtility.sendToEveryStudent(tempCommand);
break;
default:
break;
}

}

这是在我的 Jar 中,我希望用户能够在包装器应用程序中添加任意数量的案例作为函数。此外,最好是,我想将现有案例放在用于在包装器应用程序中注册命令和函数的同一 HashMap 中。

我需要知道正确的设计模式和一些如何去做的建议。
提前致谢。

最佳答案

将设计模式 Command 与功能代码到命令的映射相结合。这样做的好处是将实现移动到它们自己的独立类中,从而使代码更易于管理和测试。

您可能想使用 Design Pattern Visitor 而不是修改命令映射,但这取决于您的情况。

命令的通用接口(interface)

public Interface Command {
void action();
}

创建一堆具体命令

public class Course implements Command {
private final String tempCommand;
private final ParentClass parent;

public Course(final String tempCommand, final ParentClass parent) {
this.tempCommand = tempCommand;
this.parent = parent;
}

public void action() {
parent.setCourse(tempCommand.split(parent.getDelimiter())[1]);
}
};

将预先存在的功能代码映射到命令。

  private final Map<Integer, Command> getBuiltIns() {
Private final Map<Integer, Command> cmdMap = new HashMap<Integer, Command>();
cmdMap.add(CONSTANTS.COURSE, new Command(tempCommand, parent));
<etc>
return cmdMap;
}

private final cmdMap = getBuildIns();

制作一个可以添加命令的方法

public void addCommand(final int code, final Command command) {
// Check if code is already used, or there might be trouble
cmdMap.add(code, command);
}

找到命令然后执行。

private void processCommand(String tempCommand) throws NumberFormatException, IOException, ELearningException 
{
final Command theCommand = cmdMap.get(Integer.parseInt(commandParameters[0]));
theCommand.action();
}

关于java - Android - 在应用程序和 Jar 的 HashMap 中动态添加函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11516886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com