• 设计模式-命令行模式


    命令行模式

    定义:将一个请求封装为一个对象,使发出的请求的对象和执行请求的对象分割开。这两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

    顺序:请求者->命令->执行者
    优点:

    • 降低系统耦合度
    • 扩展性好,增加或删除命令不会影响其他类
    • 方便实现Undo和Redo操作,命令模式可以与备忘录模式组合使用
    • 可以在现有命令的基础上,增加额外功能。

    命令模式结构:

    • 抽象命令类(Command):声明执行命令的接口,拥有执行命令的抽象方法 execute()
    • 具体命令类(ConcreteCommand):是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
    • 接收者(Receiver): 执行命令功能的相关操作,是命令对象业务的真正实现者
    • 请求者(Invoker):请求发送者,它拥有很多命令对象,通过访问命令对象来执行相关请求。

    使用场景:在某些场合,比如要对行为进行“记录、撤销、重做”等处理。或者认为是命令的地方。

    示例场景:顾客点了一道菜,点菜这个可以当成是一个命令,顾客是请求者,厨师是接收者。

    示例代码:

    public interface Command {
    
        void execute();
    }
    
    public class FoodCommand implements Command {
    
        private Receiver receiver;
    
        private String foodName;
    
        public FoodCommand(String foodName) {
            this.foodName = foodName;
        }
    
        public Receiver getReceiver() {
            return receiver;
        }
    
        public void setReceiver(Receiver receiver) {
            this.receiver = receiver;
        }
    
        @Override
        public void execute() {
            receiver.action(foodName);
        }
    }
    
    /**
     * 顾客类
     */
    public class Customer {
    
        private Command command;
    
        public Customer(Command command) {
            this.command = command;
        }
    
        public void call(){
            System.out.println("顾客点菜");
            command.execute();
        }
    }
    
    
    /**
     * 厨师类
     */
    public class Receiver {
    
        public void action(String foodName){
            System.out.println("厨师开始制作:"+foodName);
        }
    }
    

    测试代码:

    public class ParteenDemo {
    
        public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
            FoodCommand command=new FoodCommand("红烧茄子");
            Receiver receiver=new Receiver();
            command.setReceiver(receiver);
    
            Customer customer=new Customer(command);
            customer.call();
    
        }
    }
    

    命令模式还有一种扩展,与组合模式结合,称为组合命令模式。结构如下:

    返回目录

    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    SEVERE: One or more listeners failed to start.
    springboot junit单元测试报错
    mybatis 日期查询datetime
    设计模式详解之程序设计六大原则
    非maven项目 idea project structure
    jdbcType DATE和TIMESTAMP区别
    mysql 保存23:59:59 自动加一秒
    1、在linux服务器centos虚拟机搭建nginx网站
    QRCode 生成二维码
    CSS3的calc()使用
  • 原文地址:https://www.cnblogs.com/javammc/p/14952412.html
Copyright © 2020-2023  润新知