zoukankan      html  css  js  c++  java
  • 设计模式 之 命令(Command)模式

    命令模式:

    命令模式是对命令的封装。它将发出的命令的责任和执行的命令分隔开,委派给不同的对象。被委派的对象虽然具有执行的命令,但只有在接收到命令后,才会执行命令。

    下面是命令模式的结构图:

    命令模式涉及五个角色:

    • 客户类(Client):创建一个具体的命令对象,确认其接收者。
    • 抽象命令类(Command):声明一个给所有具体命令类的抽象接口。这是一个抽象角色,可以是接口或抽象类。
    • 具体命令类(ConcreteCommand):定义一个接受者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。
    • 请求者类(Invoke):负责对调用命令对象执行请求,相关的方法叫做行动方法
    • 接收者类(Receiver):负责具体实施和执行请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

    PS:值得注意的是:接收者类,具有接收到命令会执行的动作,但它只有在接收到命令时才会执行

    源代码分析:

    接收者类(Receiver)

    Receiver.java:

    public class Receiver {
        public Receiver(){
            System.out.println("命令接收者:");
        }
        
        public void action(){
            System.out.println("接收到命令后,执行的动作");
        }
    }

    抽象命令类(Command)

    Command.java:

    public interface Command {
        
        public void excute();
        
    }

    具体命令类(ConcreteCommand)

    ConcreteCommand.java:

    public class ConcreteCommand implements Command{
        
        Receiver receiver;
        
        public ConcreteCommand(Receiver receiver){
            this.receiver = receiver;
        }
        //实现调用接收者类执行动作的方法
        @Override
        public void excute() {
            receiver.action();
        }
    }

    发送请求类(Invoker)

    Invoker.java

    public class Invoker {
        private Command command;
        
        public Invoker(Command command){
            this.command = command;
        }
        //发送命令
        public void action(){
            command.excute();
        }
    }

    客户端:

    public class Client {
        public static void main(String[] args){
            Receiver receiver = new Receiver();
            Command command = new ConcreteCommand(receiver);
            Invoker invoker = new Invoker(command);
            invoker.action();
        }
    }

    运行结果:

    命令接收者:
    接收到命令后,执行的动作
  • 相关阅读:
    212-@Slf4j注解起到了什么作用?
    212-如何实现定时器扫描?
    211-redis单线程问题?
    211-Feign中的@RequestParm与@RequestBody注解的使用
    210-java加载类的时候,发生了什么了呢?
    209-thymeleaf简单使用
    JS自定义 Map
    java Main方法 获取 maven 的resource 下的xml文件
    springboot+thymeleaf 访问静态资源解决(static)
    两个list 合并后去除掉重复removeAll()的,然后再随机获取最后list中的 几个值
  • 原文地址:https://www.cnblogs.com/mercuryli/p/5304047.html
Copyright © 2011-2022 走看看