背景
主持人:各位好,欢迎再次莅临机战世界。机体工厂最近为我们新进了一批古铁,目前正在有条不紊的训练机师中,由我们的响介队长来示范下如何使用古铁进行攻击。下面我们有请响介队长。
响介:我是响介,古铁mkiii的机师,联邦军队长。今天教大家如何让古铁发动攻击。我们不可能直接命令古铁进行攻击,我们必须有一个中介,通过中介去命令古铁,这个中介就是按钮。
群众(烦躁中):哪那么多废话?
主持人:我们把响介的话概括下,就是命令的请求者(响介)和实现者(古铁)通过中介(按钮)达到了解耦的目的。
群众(烦躁中):什么鬼?
响介:我们进一步探讨古铁的美妙之处~
实现
古铁的武器库,我们通过点击按钮使用某种武器
/**
* 古铁的武器是一堆按钮
*/
public class AncientIronWeapon {
public void revolverPileDriver() {
System.out.println("左轮打桩机,伤害5500");
}
public void heatGasAngle() {
System.out.println("热气角,伤害4700");
}
public void pointerMine() {
System.out.println("指向性地雷,伤害6100");
}
}
武器按钮接口
public interface IWeaponCommand {
/**
* 使用武器
*/
void useWeapon();
}
热气角按钮
/**
* 热气角按钮
*/
public class HeatGasAngleCommand implements IWeaponCommand {
private AncientIronWeapon weapon;
public HeatGasAngleCommand(AncientIronWeapon weapon) {
super();
this.weapon = weapon;
}
@Override
public void useWeapon() {
weapon.heatGasAngle();
}
}
左轮打桩机按钮
/**
* 左轮打桩机按钮
*/
public class RevolverPileDriverCommand implements IWeaponCommand {
private AncientIronWeapon weapon;
public RevolverPileDriverCommand(AncientIronWeapon weapon) {
super();
this.weapon = weapon;
}
@Override
public void useWeapon() {
weapon.revolverPileDriver();
}
}
指向性地雷按钮
/**
* 指向性地雷命令
*/
public class PointerMineCommand implements IWeaponCommand {
private AncientIronWeapon weapon;
public PointerMineCommand(AncientIronWeapon weapon) {
super();
this.weapon = weapon;
}
@Override
public void useWeapon() {
weapon.pointerMine();
}
}
响介机师,也就是按钮的使用者
/**
* 命令调用者:响介
* 注:古铁的机师是响介,响介不是直接让古铁去使用武器的,他需要按下一些按钮(命令),命令会让古铁使用武器
*/
public class XiangjieInvoker {
private IWeaponCommand weaponCommand;
public IWeaponCommand getWeaponCommand() {
return weaponCommand;
}
/**
* 设置哪个命令?
*/
public void setWeaponCommand(IWeaponCommand weaponCommand) {
this.weaponCommand = weaponCommand;
}
/**
* 按下武器按钮,使用武器
*/
public void pressTheButton() {
weaponCommand.useWeapon();
}
}
测试
/**
* 测试类
*/
public class CommandTest {
public static void main(String[] args) {
XiangjieInvoker invoker = new XiangjieInvoker();
// 按下'左轮打桩机'按钮
System.out.println("按下'左轮打桩机'按钮");
invoker.setWeaponCommand(new RevolverPileDriverCommand(new AncientIronWeapon()));
invoker.pressTheButton();
System.out.println("------------------");
// 按下'热气角'按钮
System.out.println("按下'热气角'按钮");
invoker.setWeaponCommand(new HeatGasAngleCommand(new AncientIronWeapon()));
invoker.pressTheButton();
System.out.println("------------------");
// 按下'指向性地雷'按钮
System.out.println("按下'指向性地雷'按钮");
invoker.setWeaponCommand(new PointerMineCommand(new AncientIronWeapon()));
invoker.pressTheButton();
System.out.println("------------------");
}
}
结果
按下'左轮打桩机'按钮
左轮打桩机,伤害5500
------------------
按下'热气角'按钮
热气角,伤害4700
------------------
按下'指向性地雷'按钮
指向性地雷,伤害6100
------------------
总结
响介:大家明白了吗?今天主要跟大家讲了下使用武器的一些方法,有什么问题需要问的吗?
群众A:这个设计思路好像我以前在哪里见到过。有点像策略模式?
响介:这位教员学的不错,还记得策略模式。今天我们讲的内容涉及到命令模式,和策略模式很像,但还是有区别的。
命令模式侧重将命令的调用者和实现者解耦。
策略模式侧重对算法的封装,比如排序有多种实现方式,就可以用策略模式。
说了这么多,其实我自己也不是很明白,我以后明白了会告诉你们~~