Java设计模式-命令模式

背景

主持人:各位好,欢迎再次莅临机战世界。机体工厂最近为我们新进了一批古铁,目前正在有条不紊的训练机师中,由我们的响介队长来示范下如何使用古铁进行攻击。下面我们有请响介队长。
响介:我是响介,古铁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:这个设计思路好像我以前在哪里见到过。有点像策略模式?
响介:这位教员学的不错,还记得策略模式。今天我们讲的内容涉及到命令模式,和策略模式很像,但还是有区别的。
命令模式侧重将命令的调用者和实现者解耦。
策略模式侧重对算法的封装,比如排序有多种实现方式,就可以用策略模式。
说了这么多,其实我自己也不是很明白,我以后明白了会告诉你们~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值