デザインモードのコマンドモード6--

空腹の場合は、飲み物にのどが渇いて、睡眠眠い、食べて、人生はあまりにも退屈です


1コマンドモード

1.1コンセプト

コンセプト:オブジェクトにカプセル化「要求」は、異なる要求を使用するためには、キューまたはログには、他のオブジェクトをパラメータ化。コマンドモードもアンドゥ操作をサポートしています。
ことでは現在、どのようにコマンドモードを理解するには、以下の具体的な例を挙げて!

1.2 引例

レストランの食事に顧客事例のポイントを分析します。図1:

  1. お客様は、オーダーにハンバーガー、フライドポテトの袋を書き留めます。コールcreateOrder()シングルポイント次の食事を。
  2. ウェイター使用takeOrder()離れて、顧客の注文を埋めるための方法。
  3. ウェイターコールorderUp()通知シェフが製品を準備します。
  4. シェフが注文、見えたコンテンツ、通話を取得makeHumburger()し、makeFries()
    ここに画像を挿入説明

コードの実装

//厨师类
public class Cook  {

	public Cook() {}

	public void makeBurger() {
		System.out.println("Making a burger");
	}

	public void makeFries() {
		System.out.println("Making fries");
	}

}

//顾客类
public class Customer {
    Waitress waitress;

    public Customer(Waitress waitress) {
        this.waitress = waitress;
    }

    public void hungry(Order o) {
        System.out.println("服务员点餐");
        order();
        waitress.takeOrder(o);
    }

    public void order() {
        System.out.println("我要汉堡和薯条");
    }
}

//服务员类
public class Waitress {
	Order order;

	public Waitress() {
	}

	public void takeOrder(Order order) {
		this.order = order;
		order.orderUp();
	}
}

//订单接口
public interface Order {
	public void orderUp();
}

//测试代码
public class Diner {
	public static void main(String[] args) {
		Cook cook = new Cook();
		Waitress waitress = new Waitress();
		Customer customer = new Customer(waitress);

		Order o = () -> {
			cook.makeBurger();
			cook.makeFries();
		};
		customer.hungry(o);
	}
}

1.3分析

オーダーを終了するために発生した、ウェイターがオーダーの実際の内容を知っている必要はありません、ウェイターの仕事は、お客様の手の手から順番に調理することです。この例では、著者(顧客)と離れて依頼者(シェフ)の実装を要求します。これは、コマンド・モードのアイデアです。
図2:

  1. コマンドオブジェクト(コマンド)を作成するために、クライアント(クライアント)、コマンドオブジェクトを実行するアクションの受信機(レシーバー)のセットが含まれています。

  2. Commandオブジェクトを提供してexecute()受信者をカプセル化する方法は、操作を行う必要があります。受信者のこれらのアクションを呼び出しますこれらのメソッドを呼び出します。

  3. クライアントコール発信者の(インボーカ)setCommand()、およびメソッドに渡されたコマンドオブジェクト。

  4. 呼び出し側は、コマンドオブジェクトの呼び出し、execute()メソッドを。

  5. これらのアクションの実装の最終受信者

ここに画像を挿入説明

1.4コマンド・モード図クラス

  • コマンドは、インターフェイスとして定義され、呼び出しexecute()操作の関連する方法は、受信者を行います。
  • Invokerコマンドオブジェクトを保持および特定の時間にコマンドオブジェクトのポイントを呼び出すexecute()要求を達成するために、。
  • クライアントの作成を担当ConcreteCommandし、その受信者を設定します。

ここに画像を挿入説明

実施例1.5の改善プライマー

図中の(1)。

  • クックmakeBurger()makeFries()に抽象化Command2つの実装形成Commandインターフェイスクラスを:CookMakeBurgerCommandCookMakeFriesCommand
  • waitress抽象化InvokerことでtakeOrder()メソッド呼び出しCommandインタフェースexecute()のメソッド。

ここに画像を挿入説明
(2)コード

public interface Order {
	public void execute();
}


public class CookMakeFriesCommand implements Order {
    private Cook cook;

    public CookMakeFriesCommand(Cook cook) {
        this.cook = cook;
    }

    @Override
    public void execute() {
        cook.makeFries();
    }
}

public class CookMakeBurgerCommand implements Order {
    private Cook cook;

    public CookMakeBurgerCommand(Cook cook) {
        this.cook = cook;
    }

    @Override
    public void execute() {
        cook.makeBurger();
    }
}

public class Cook  {

	public Cook() {}

	public void makeBurger() {
		System.out.println("Making a burger");
	}

	public void makeFries() {
		System.out.println("Making fries");
	}

}

public class Customer {
    Waitress waitress;

    public Customer(Waitress waitress) {
        this.waitress = waitress;
    }

    public void hungry(Order o) {
        System.out.println("服务员点餐");
        waitress.takeOrder(o);
    }

}

public class Waitress {
	Order order;

	public Waitress() {
	}

	private void setOrder(Order order){
		this.order=order;
	}

	public void takeOrder(Order order) {
		setOrder(order);
		order.execute();
	}
}

public class Diner {
	public static void main(String[] args) {
		Cook cook = new Cook();
		Waitress waitress = new Waitress();
		Customer customer = new Customer(waitress);
		CookMakeFriesCommand friesCommand=new CookMakeFriesCommand(cook);
		CookMakeBurgerCommand burgerCommand=new CookMakeBurgerCommand(cook);

		customer.hungry(friesCommand);
		customer.hungry(burgerCommand);


	}
}

実施例2運動(リモコン)

APIは、スマートホームのすべての種類を制御するスマートホームのリモートコントロールのために設計する必要があります。ライトやガレージのドアの設計例をまず。

図クラス2.1

ラージオブジェクトのメソッドは、より多くのアップにも対応したコマンドクラスを生成するときに、見ることができます。この例を通じて、これはコマンドモードの欠点はあります。

ここに画像を挿入説明

2.2コード

public class GarageDoor {

    public GarageDoor() {
    }

    public void up() {
        System.out.println("Garage Door is Open");
    }

    public void down() {
        System.out.println("Garage Door is Closed");
    }

    public void stop() {
        System.out.println("Garage Door is Stopped");
    }

    public void lightOn() {
        System.out.println("Garage light is on");
    }

    public void lightOff() {
        System.out.println("Garage light is off");
    }
}

public class Light {
    public Light() {
    }

    public void on() {
        System.out.println("Light is on");
    }

    public void off() {
        System.out.println("Light is off");
    }
}

public interface Command {
    void execute();
}

public class GarageDoorDownCommand implements Command {
    GarageDoor garageDoor;

    public GarageDoorDownCommand(GarageDoor garageDoor) {
        this.garageDoor = garageDoor;
    }

    @Override
    public void execute() {
        garageDoor.down();
    }

}

public class GarageDoorLightOffCommand implements Command {
    GarageDoor garageDoor;

    public GarageDoorLightOffCommand(GarageDoor garageDoor) {
        this.garageDoor = garageDoor;
    }

    @Override
    public void execute() {
        garageDoor.lightOff();
    }
}

public class GarageDoorOpenCommand implements Command {
    GarageDoor garageDoor;

    public GarageDoorOpenCommand(GarageDoor garageDoor) {
        this.garageDoor = garageDoor;
    }

    public void execute() {
        garageDoor.up();
    }
}

public class GarageDoorStopCommand implements Command {
    GarageDoor garageDoor;

    public GarageDoorStopCommand(GarageDoor garageDoor) {
        this.garageDoor = garageDoor;
    }

    @Override
    public void execute() {
        garageDoor.stop();
    }
}

public class GarageLightOnCommand implements Command {
    GarageDoor garageDoor;

    public GarageLightOnCommand(GarageDoor garageDoor) {
        this.garageDoor = garageDoor;
    }

    @Override
    public void execute() {
        garageDoor.lightOn();
    }
}

public class LightOffCommand implements Command {
    Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.off();
    }
}

public class LightOnCommand implements Command {
    Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.on();
    }
}

public class SimpleRemoteControl {
    Command slot;

    public SimpleRemoteControl() {}

    public void setCommand(Command command) {
        slot = command;
    }

    public void buttonWasPressed() {
        slot.execute();
    }
}


public class RemoteControlTest {
    public static void main(String[] args) {
        SimpleRemoteControl remote = new SimpleRemoteControl();
        Light light = new Light();
        GarageDoor garageDoor = new GarageDoor();
        LightOnCommand lightOn = new LightOnCommand(light);
        GarageDoorOpenCommand garageOpen = new GarageDoorOpenCommand(garageDoor);
        GarageDoorDownCommand garageDoorDownCommand = new GarageDoorDownCommand(garageDoor);
        GarageDoorStopCommand garageDoorStopCommand = new GarageDoorStopCommand(garageDoor);
        GarageDoorLightOffCommand garageDoorLightOffCommand = new GarageDoorLightOffCommand(garageDoor);
        GarageLightOnCommand garageLightOnCommand = new GarageLightOnCommand(garageDoor);

        remote.setCommand(garageOpen);
        remote.buttonWasPressed();
        remote.setCommand(garageLightOnCommand);
        remote.buttonWasPressed();
        remote.setCommand(garageDoorStopCommand);
        remote.buttonWasPressed();
        remote.setCommand(garageDoorDownCommand);
        remote.buttonWasPressed();
        remote.setCommand(garageDoorLightOffCommand);
        remote.buttonWasPressed();
        remote.setCommand(lightOn);
        remote.buttonWasPressed();
    }
}

公開された16元の記事 ウォンの賞賛3 ビュー954

おすすめ

転載: blog.csdn.net/weixin_41938180/article/details/104334546