Android设计模式之(10)----命令模式

命令模式

命令模式属于行为模式。如你的上级领导指派给你的A,B,C三项任务。让你做A,你就做A,让你做B就做B。指哪打哪。

外部的人对于你和你的领导来说,知道你的领导派发了ABC任务给你,你也完成ABC任务,任务具体是怎么完成的外部的人并不需要关心。

使用场景

  • 某一对象有一系列的事物操作
  • 具有抽象行为的动作,支持多种类型的操作

代码示例

大学的新生入学都会进行军训,军训的项目有正步,齐步,军姿等等… 而这一系列的内容都是由教官下发命令,所有的同学进行执行。

  • 常规实现方式

只需要封装一个具体的军训类管理即可,直接调用即可

public class MilitaryTraining {

    public void march() {
        System.out.print("军训齐步");
    }

    public void goose() {
        System.out.print("军训正步");

    }
}
  • 命令模式
(一)命令接口做什么
public interface Command {
    void doSomothing();//具体做什么
}
(二)具体的命令

齐步命令:

public class MarchCommand implements  Command {
    private  MilitaryTraining militaryTraining;

    public MarchCommand(MilitaryTraining militaryTraining1) {
        this.militaryTraining = militaryTraining1;
    }

    @Override
    public void doSomothing() {
        if (militaryTraining!=null){
            militaryTraining.march();
        }
    }
}

正步命令:

public class GooseCommand implements Command {
    private MilitaryTraining militaryTraining;

    public GooseCommand(MilitaryTraining militaryTraining1) {
        this.militaryTraining = militaryTraining1;
    }


    @Override
    public void doSomothing() {
        if (militaryTraining != null) {
            militaryTraining.goose();
        }
    }
}
(三)命令控制的管理器
public class CommandController {
    private  GooseCommand gooseCommand;
    private  MarchCommand marchCommand;

    public void setGooseCommand(GooseCommand gooseCommand) {
        this.gooseCommand = gooseCommand;
    }

    public void setMarchCommand(MarchCommand marchCommand) {
        this.marchCommand = marchCommand;
    }

    public void  marchCommadn(){
        if(marchCommand!=null){
            marchCommand.doSomothing();
        }
    }

    public  void  gooseCommand(){
        if(gooseCommand!=null){
            gooseCommand.doSomothing();
        }
    }
}
(四)调用方式
  • 常规方式
        MilitaryTraining militaryTraining=new MilitaryTraining();
        militaryTraining.goose();//正步
        militaryTraining.march();//齐步
  • 命令模式
        //采用命令模式调用
        /**
         * 优点:命令模式耦合度更低,扩展性更强,维护方便,
         * 可对命令进行组合使用
         * 对新的命令扩展更容易
         *
         * 缺点:命令类很多,对基础技术要求较高,否则难于阅读代码。
         */
        MilitaryTraining militaryTraining1 = new MilitaryTraining();
        GooseCommand gooseCommand = new GooseCommand(militaryTraining1);
        MarchCommand marchCommand = new MarchCommand(militaryTraining1);

        CommandController commandController = new CommandController();

        commandController.setGooseCommand(gooseCommand);
        commandController.setMarchCommand(marchCommand);

        commandController.gooseCommand();
        commandController.marchCommadn();
(五)显示结果
军训正步
军训齐步
军训正步
军训齐步

总结

优点:
  • 耦合度低,命令可控,可组合同时完成或者顺序完成
缺点:
  • 类太多,简单的行为命令反而复杂

明显看出上面的调用方式,传统方式2行代码就可以解决的问题,使用命令模式却多了很多类和代码,还不如不用设计模式清晰简单,为什么会这样呢?

因为上述的命令以及行为操作很简单,因此对于简单的行为操作命令,个人建议按照传统方式使用书写就好,过度使用设计模式反而令人不易理解,类的增加也极其迅速。

但是命令模式的好处是对于复杂的行为命令,可以更好的降低耦合度,将命令发起方与执行方隔离,只需要发起命令,由谁完成,怎么样完成都不需要知道。

github代码地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值