设计23式—命令

/*
 * 命令模式
 * 优点
 * 类间解耦,调用者角色与接收者角色之间没有任何依赖关系
 * 可扩展性,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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值