1

引数の型が異なるコマンドをキャプチャするクラスを作成するにはどうすればよいですか? スイングによってドア オブジェクトを操作するための同様の引数タイプを持つコマンドをキャプチャするには(Swing, DoorNo, swingAngle)、次のようにクラスを作成します。

class DoorCommand {
     private String commandName;
     private int doorNo;
     private float swingAngle;

     public DoorCommand (String cmdName, int doorNo, float swing angle) {
        // set values here
     }

     // do all the setter and getter here
}

私の質問は、(Lock, ENABLE/DISABLE)引数として使用してドアのロックを有効または無効にする必要があるということです。DoorCommandクラスでこれにどのように対応できますか?DoorCommands をリストに格納できるようにしたい。List<DoorCommand> doorCommands = new ArrayList<DoorCommand>();

4

5 に答える 5

2

ドアコマンドのインターフェイスを抽出しないのはなぜIDoorCommandですか?

次にDoorCommand、あなたの例からそれを実装してください(実際には、名前をより関連性の高いものに変更しますSwingDoorCommand)。

次に、コンストラクターの引数に応じて、ロックを閉じたり開いIDoorCommandたりする別のコマンドを実装します。DoorLockControlCommand

このようにして、両方のタイプのコマンドを格納しList<IDoorCommand>、どのコマンドが実行するかについて詳細を知らなくても呼び出すことができます。

これがあなたの質問に答えることを願っています。

于 2013-07-31T11:01:46.453 に答える
1

Command Patternをチェックアウトすると、各コマンドを共通インターフェイスのサブクラスとして作成できるため、履歴や元に戻す目的でコマンドをリストに保存できます。あなたの場合:

// The basic interface for all door commands
public interface DoorCommand {
    public void execute(Door door) throws CommandException;
}

// The Door class is the recipient for all commands
public class Door {
    private List<Command> history = new ArrayList<Command>();
    private int angle;
    private boolean locked;

    public void addCommandToHistory(Command command) {
        history.add(command);
    }

    // Getters and setters.
}

// The command to open the door
public class OpenDoor implements DoorCommand {
    public void execute(Door door) throws CommandException {
        door.addCommandToHistory(this);
        if (door.isLocked()) {
            throw new CommandException("Door is locked, cannot open");
        }
        if (door.getAngle() < 90) {
            door.setAngle(90);
        }
    }
}

// Another command, LockDoor
public class LockDoor implements DoorCommand {
    public void execute(Door door) throws CommandException {
        door.addCommandToHistory(this);
        door.setLocked(true);
    }
}

次に、次のようなコマンドを使用できます。

public void operateDoor() {
    Door door = new Door();
    new LockDoor().execute(door);
    new OpenDoor().execute(door);
}

Doorまたは、コンストラクターを使用してオブジェクトをコマンドに渡すこともできます。

于 2013-07-31T11:12:47.490 に答える
1

あなたの質問を正しく理解しているかどうかわかりません。あなたのコマンドは操作の情報を保存しているだけのように思えます。たとえば、ドアのインスタンス変数を変更するなど、ドアに対して操作を行っているわけではありません。これを変更したい場合は、 Command Patternを使用できます。おそらく、それはすでにあなたの計画です。コマンドはDoor、実行時に の状態を考慮する必要がありました。

于 2013-07-31T11:13:17.500 に答える
0

polymorphismを使用して、このようなものを使用します。

public class DoorCommand {
    private String cmdName;
    private static List<DoorCommand> list;

    static interface DoorCommandBase {
        void doAction(Object... arg);
    }

    class SwingCommand implements DoorCommandBase {
        void doAction(Object... arg) {
            int doorNo;
            float swingAngle;

            cmdName = arg[0];
            doorNo = arg[1];
            swingAngle = arg[2];
            // action to be performed
            updateList(arg);
        }
    }

    class LockCommand implements DoorCommandBase {
        void doAction(Object... arg) {
            boolean istrue;

            cmdName = arg[0];
            istrue = arg[1];
            // action to be performed
            updateList(arg);
        }
    }

    public static void updateList(Object... arg) {
        // update list
    }

    // getters and setters
}
于 2013-07-31T11:28:28.490 に答える