设计模式与应用:命令模式

介绍

Command模式 命令模式

行为模式之一

应用场景

在面向对象的程序设计过程中,一个对象调用另一个对象,一般情况下的调用过程:创建目标对象实例,设置调用参数,调用目标对象方法

但在有些情况下,有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类叫做Command类

  • 整个调用过程比较复杂,或者多出存在这种调用,此时使用Command类对该调用加以封装,便于功能的再利用
  • 调用前后需要对调用参数进行某些处理
  • 调用前后需要进行某些额外处理,比如日志、缓存、记录历史操作等等

结构图

在这里插入图片描述

角色与职责

  • Command:Command抽象类
  • ConcreteCommand:Command的具体实现类
  • Receiver:需要被调用的目标对象
  • Invorker:通过Invorker执行Command对象

代码实现

在这里插入图片描述

  • Receiver

    /**
     * 角色:Receiver 小商贩
     */
    public class PeddlerReceiver {
    
        public void sailApple(){
            System.out.println("卖苹果");
        }
    
        public void sailBanana(){
            System.out.println("卖香蕉");
        }
    
    }
    
  • Command

    /**
     * 角色:抽象Command
     */
    public abstract class Command {
    
        private PeddlerReceiver peddler;
    
        public Command(PeddlerReceiver peddler) {
            this.peddler = peddler;
        }
    
        public PeddlerReceiver getPeddler() {
            return peddler;
        }
    
        public void setPeddler(PeddlerReceiver peddler) {
            this.peddler = peddler;
        }
    
        public abstract void sail();
    
    }
    
    
    /**
     * 角色:ConcreteCommand
     */
    public class AppleCommand extends Command{
    
        public AppleCommand(PeddlerReceiver peddler) {
            super(peddler);
        }
    
        @Override
        public void sail() {
            this.getPeddler().sailApple();
        }
    }
    
    /**
     * 角色:ConcreteCommand
     */
    public class BananaCommand extends Command{
    
        public BananaCommand(PeddlerReceiver peddler) {
            super(peddler);
        }
    
        @Override
        public void sail() {
            this.getPeddler().sailBanana();
        }
    }
    
  • Invoker

    /**
     * 角色:Invoker 服务员
     */
    public class WaiterInvoker {
    
        private Command command;
    
        public void sail(){
            command.sail();
        }
    
        public Command getCommand() {
            return command;
        }
    
        public void setCommand(Command command) {
            this.command = command;
        }
    }
    
    
  • 测试

    /**
     * 测试
     */
    public class ClientTest {
    
        public static void main(String[] args) {
            PeddlerReceiver receiver = new PeddlerReceiver();
    
            // 定义命令,并指定命令具体接收者
            Command appleCommand = new AppleCommand(receiver);
            Command bananaCommand = new BananaCommand(receiver);
    
            // 定义调用者
            WaiterInvoker invoker = new WaiterInvoker();
    
            // 调用接收命令并执行
            invoker.setCommand(appleCommand);
            invoker.sail();
    
            invoker.setCommand(bananaCommand);
            invoker.sail();
        }
    
    }
    
    

小结

此模式实际应用场景广泛,开发过程中或多或少都会使用到,只是不知觉是类似命令模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值