/*
* 命令模式
* 优点
* 类间解耦,调用者角色与接收者角色之间没有任何依赖关系
* 可扩展性,Command的子类可以非常容易地扩展
* 缺点
* 命令越多,Command类越膨胀(可通过模板方法模式降低)
*/
public class MyMain {
public static void main(String[] args) {
// 实例一个具体的传令官
Invoker invoker = new Invoker();
System.out.println("将军要求炮兵攻击,空军攻击");
// 实例C号将军命令
Command command = new CommandC();
// 传令官接受命令
invoker.setCommand(command);
// 执行命令
invoker.action();
}
}
// 抽象的军队类(接收者:干活的)
abstract class Army {
// 抽象的攻击方法
abstract public void attack();
// 抽象的撤退方法
abstract public void retreat();
}
// 具体的炮兵军队
class Artillery extends Army {
@Override
public void attack() {
System.out.println("炮兵军队开始攻击");
}
@Override
public void retreat() {
System.out.println("炮兵军队开始撤退");
}
}
// 具体的空军军队
class AirForce extends Army {
@Override
public void attack() {
System.out.println("空军军队开始攻击");
}
@Override
public void retreat() {
System.out.println("空军军队开始撤退");
}
}
// 抽象的将军命令(命令:需要执行的所有命令)
abstract class Command {
// 炮兵部队
Artillery artillery = new Artillery();
// 空军部队
AirForce airForce = new AirForce();
// 命令执行方式
abstract public void execute();
}
// 具体的A号将军命令(炮兵攻击,空军撤退)
class CommandA extends Command {
public CommandA() {
System.out.println("生成A号命令:炮兵攻击,空军撤退");
}
@Override
public void execute() {
artillery.attack();
airForce.retreat();
}
}
// 具体的B号将军命令(空军攻击,炮兵撤退)
class CommandB extends Command {
public CommandB() {
System.out.println("生成B号命令:空军攻击,炮兵撤退");
}
@Override
public void execute() {
airForce.attack();
artillery.retreat();
}
}
// 具体的C号将军命令(空军攻击,炮兵攻击)
class CommandC extends Command {
public CommandC() {
System.out.println("生成C号命令:空军攻击,炮兵攻击");
}
@Override
public void execute() {
airForce.attack();
artillery.attack();
}
}
// 传令官(调用者:接收到命令,并执行命令)
class Invoker {
private Command command = null;
// 接受命令
public void setCommand(Command command) {
System.out.println("传令官接受命令");
this.command = command;
}
// 执行命令
public void action() {
System.out.println("传令官执行命令");
command.execute();
}
}