设计模式-命令模式

1 概念

一种高内聚模式,将一个请求封装成一个对象,从而让你使用的不同请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

2 概念解释

是一种数据驱动的设计模式,请求以命令形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适对象并把该命令传给对应对象,该对象执行命令。

命令模式通用类图如下:
命令模式通用类图

3 使用场景

  • 认为是使用命令的地方,如GUI开发,模拟DOS命令等
  • 类似触发反馈机制处理等

4 命令模式优缺点

4.1 命令模式优点

  • 类间解耦

    调用者和接收者之间无依赖关系,调用者实现功能只需调用Command抽象类方法即可

  • 可拓展性

    Command子类可以非常容易地拓展,调用者invoker和高层次的模块Client不产生严重的代码耦合

  • 命令模式搭配其他模式效果更佳

    命令模式结合责任链模式,实现命令族解析任务;结合模板模式,减少Command类的膨胀

4.2 命令模式的缺点

命令多的话,命令类会膨胀

5 参考例子

5.1 创建Command接口

    public interface ICommand {
        void execute();
    }

5.2 创建命令执行对象

    public class Receiver {
        public void execute(){
            System.out.println("receiver execute ... ");
        }
    }

5.3 创建具体Command实现类

    public class ConcreteCommandA implements ICommand {
        private Receiver receiver;
        public ConcreteCommandA(Receiver receiver){
            this.receiver = receiver;
        }
        @Override
        public void execute() {
            System.out.println("ConcreteCommandA execute ...");
            receiver.execute();
        }
    }
    public class ConcreteCommandB implements ICommand {
        private Receiver receiver;
        public ConcreteCommandB(Receiver receiver){
            this.receiver = receiver;
        }
        @Override
        public void execute() {
            System.out.println("ConcreteCommandB execute ...");
            receiver.execute();
        }
    }

5.4 创建命令入口

    public class Invoker {
        private ICommand concreteCommandA, concreteCommandB;
        public Invoker(ICommand concreteCommandA, ICommand concreteCommandB){
            this.concreteCommandA = concreteCommandA;
            this.concreteCommandB = concreteCommandB;
        }
        public void orderA(){
            concreteCommandA.execute();
        }
        public void orderB(){
            concreteCommandB.execute();
        }
    }

5.5 调用

    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Invoker invoker = new Invoker(new ConcreteCommandA(receiver), new ConcreteCommandB(receiver));
        invoker.orderA();
        invoker.orderB();
    }

5.6 输出

 ConcreteCommandA execute ...
    receiver execute ... 
    ConcreteCommandB execute ...
    receiver execute ... 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值