2

こんにちは私はラッパーアプリケーションとラッパーアプリのサービスで実行されるjarを持っています。完全なソリューションでは、Jarはユーザーに提供できない私の製品ですが、ソケットから受信したコマンドに対して機能を登録することにより、機能を拡張する自由をユーザーに与える必要があります。彼らはラッパーアプリケーションでそれを行うことができます。私はすでにフレックス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の内部にあり、ユーザーがラッパーアプリケーションの関数として任意の数のケースを追加できるようにしたいと思います。さらに、できれば、既存のケースを、ラッパーアプリケーションでコマンドと関数を登録するために使用されるのと同じハッシュマップに配置したいと思います。

正しいデザインパターンとその方法についてのアドバイスを知る必要があります。
前もって感謝します。

4

1 に答える 1

1

設計パターン Command を関数コードのコマンドへのマッピングと組み合わせます。これには、実装を独自の自己完結型クラスに移動するという利点があり、コードがより管理しやすく、テストしやすくなります。

コマンド マップを変更する代わりに、デザイン パターン ビジターを使用することもできますが、状況によって異なります。

コマンドの共通インターフェース

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();
}
于 2012-10-16T18:58:06.543 に答える