zoukankan      html  css  js  c++  java
  • 第十七讲、命令模式

    1.定义

    Command模式也叫命令模式,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。

    2.命令模式的应用场景

    在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:

    • 创建目标对象实例
    • 设置调用参数
    • 调用目标对象的方法

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

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

    3.命令模式的结构

         

    4.命令模式的角色和职责

    Command--Command的抽象类

    ConcreteCommand--Command的具体实现类

    Receiver--需要被调用的目标对象

    Invorker--通过Invorker执行Command对象

    5.代码演示

    package test.com.command;
    /*
     * Receiver--需要被调用的目标对象
     */
    public class Pelder {
        public void saleApple() {
            System.out.println("卖苹果");
        }
        
        public void saleBanana() {
            System.out.println("卖香蕉");
        }
    }
    package test.com.command;
    /*
     * Command--抽象类
     */
    public abstract class Command {
        private Pelder pelder;
    
        public Command(Pelder pelder) {
            this.pelder = pelder;
        }
    
        public Pelder getPelder() {
            return pelder;
        }
    
        public abstract void sale();
    }
    package test.com.command;
    /*
     * ConcreteCommand--Command的具体实现类
     */
    public class AppleCommand extends Command {
        public AppleCommand(Pelder pelder) {
            super(pelder);
        }
        
        @Override
        public void sale() {
            this.getPelder().saleApple();
        }
    }
    package test.com.command;
    /*
     * ConcreteCommand--Command的具体实现类
     */
    public class BananaCommand extends Command {
        public BananaCommand(Pelder pelder) {
            super(pelder);
        }
        
        @Override
        public void sale() {
            super.getPelder().saleBanana();
        }
    }
    package test.com.command;
    
    import java.util.ArrayList;
    import java.util.List;
    /*
     * Invorker--通过Invorker执行Command对象
     */
    public class Waiter {
        private List<Command> commandList = new ArrayList<Command>();
    
        public void setCommand(Command command) {
            commandList.add(command);
        }
        
        public void removeCommand(Command command) {
            commandList.remove(command);
        }
        
        public void sale() {
            for(Command command : commandList) {
                command.sale();
            }
        }
    }
    package test.com.command;
    
    import test.com.command.BananaCommand;
    import test.com.command.Command;
    import test.com.command.Waiter;
    /*
     * 测试代码
     */
    public class MainClass {
        public static void main(String[] args) {
            Pelder pelder = new Pelder();
            pelder.saleApple();
            pelder.saleBanana();
            System.out.println("------------------------");
            
            Command command = new AppleCommand(pelder);
            command.sale();
            
            Command command2 = new BananaCommand(pelder);
            command2.sale();
            System.out.println("------------------------");
            
            Waiter waiter = new Waiter();
            waiter.setCommand(command);
            waiter.setCommand(command2);
            waiter.sale();
            System.out.println("------------------------");
            
            waiter.removeCommand(command2);
            waiter.sale();
            
            
        }
    }
  • 相关阅读:
    react 安装脚手架过程
    微信小程序-分享功能
    echarts 实现多图联动显示tooltip
    dom 相同父节点查找
    js 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果
    vue手写el-form组件
    vue组件传值、通信
    vue项目打包桌面应用 exe程序 以及打包为安装程序exe
    vue 使用echarts来制作图表
    前端数据可视化插件-图表
  • 原文地址:https://www.cnblogs.com/zheaven/p/10173116.html
Copyright © 2011-2022 走看看