• 设计模式之命令模式


    1 概念

      命令模式属于行为模式,目的将一个请求封装成一个对象。客户端只管发一条或是多条命令或请求,不需要关注接收者是谁,以及如何实现。

    2 适用场景和优缺点

      适用场景:客户端需要不同时间,发送不同指令;客户端和接受者解藕;系统需要支持undo redo操作。

      优点:扩展性强,便于组合命令。

    3 命令模式解读

      抽象命令Command :定义命令的接口或是抽象类,用于声明执行的execute方法。

      具体命令:实现抽象命令,接收接收者指令,并调用接收者的action()方法来完成命令需要执行的操作。

      接收者Receiver :实现具体命令,action()

      调用者Invoker:持有一个或多个命令对象,同时执行命令对象的execute()。

      客户端Client:创建具体的命令,和接收者,然后给具体命令设置接收者,给调用者设置命令对象,并执行调用者方法执行操作。

    4 实现示例

    1 package Command;
    2 
    3 /**
    4  * 抽象命令Command
    5  */
    6 public abstract class Command {
    7     protected void execute() {
    8     }
    9 }
     1 package Command;
     2 
     3 /**
     4  * 具体命令
     5  */
     6 public class CommandHandle extends Command {
     7 
     8     private Receiver receiver;
     9     private String foodName;
    10 
    11     public CommandHandle(Receiver receiver, String foodName) {
    12         this.receiver = receiver;
    13         this.foodName = foodName;
    14     }
    15 
    16     @Override
    17     protected void execute() {
    18         receiver.action(foodName);
    19     }
    20 }
     1 package Command;
     2 
     3 /**
     4  * 接收者Receiver
     5  */
     6 public class Receiver {
     7     public void action(String foodName) {
     8         System.out.println("接收者Receiver 开始。");
     9         if ("红烧排骨".equals(foodName)) {
    10             System.out.println(foodName + "需要准备排骨和胡萝卜。");
    11         }
    12         else if ("酱肉丝".equals(foodName)) {
    13             System.out.println(foodName + "需要准备精瘦肉和大葱。");
    14         }
    15         else {
    16             System.out.println(foodName + ":食材不足。");
    17         }
    18         System.out.println("接收者Receiver 结束。");
    19     }
    20 }
     1 package Command;
     2 
     3 /**
     4  * 客户端Client
     5  */
     6 public class Client {
     7     public static void main(String[] args) {
     8         Receiver receiver = new Receiver();
     9         Invoker invoker = new Invoker();
    10         Command command1 = new CommandHandle(receiver, "红烧排骨");
    11         Command command2 = new CommandHandle(receiver, "酱肉丝");
    12         invoker.setCommand(command1);
    13         invoker.setCommand(command2);
    14         invoker.doInvoke();
    15     }
    16 }

    运行结果:

    接收者Receiver 开始。
    红烧排骨需要准备排骨和胡萝卜。
    接收者Receiver 结束。
    接收者Receiver 开始。
    酱肉丝需要准备精瘦肉和大葱。
    接收者Receiver 结束。
  • 相关阅读:
    jquery之empty()与remove()区别
    (四)快速排序
    (三)归并排序
    (二)希尔排序
    (一)冒泡排序、插入排序、选择排序
    四,JVM 自带工具之jvisualvm
    JAVA多线程之Volatiles
    JAVA多线程之线程池的使用
    CountDownLatch与CyclicBarrier的使用与区别
    乐观锁与悲观锁及其实现
  • 原文地址:https://www.cnblogs.com/guobm/p/10183480.html
Copyright © 2020-2023  润新知