首页 > 其他分享 >18【命令设计模式】

18【命令设计模式】

时间:2022-12-21 11:37:07浏览次数:35  
标签:cookReceiver 18 命令 println 设计模式 public out


文章目录

  • ​​十八、命令设计模式​​
  • ​​18.1 命令设计模式简介​​
  • ​​18.1.1 命令设计模式概述​​
  • ​​18.1.2 命令设计模式的UML类图​​
  • ​​18.2 命令设计模式的实现​​
  • ​​18.3 命令设计模式的优缺点​​

十八、命令设计模式

18.1 命令设计模式简介

18.1.1 命令设计模式概述

命令设计模式(Command Pattern):命令模式是对命令的封装,将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。命令模式解耦了请求方和接收方,请求方只需要请求执行命令,不需要关心命令怎样被接收,怎样被操作以及是否被执行等;


在软件系统中,请求者与执行者通常是一种紧耦合关系,因为这些实现起来简单明了,但紧耦合的关系伴随着缺乏扩展性。在某些场合中,当对行为进行修改时必定要修改源代码。

而命令模式通过请求域实现间引入一个抽象命令接口,解耦和请求与实现,并且命令接口是抽象的,他由不同的子类实现,因此具备扩展性。命令模式的本质就是解耦命令与执行者;

18.1.2 命令设计模式的UML类图

命令设计模式主要包含如下4个角色:

  • 1)接收者角色(Receiver):负责具体执行一个请求
  • 2)抽象命令角色(ICommand):规范需要执行所有的命令行为
  • 3)具体命令角色(ConcreteCommand):实现具体命令,其内部维护一个Receiver角色,具体功能交给Receiver实现
  • 4)请求角色(Invoker):接收客户端命令,并执行命令;

18【命令设计模式】_java

18.2 命令设计模式的实现

【案例】

设计一个点餐场景,客户把订单交给服务员,服务员将客户需求交给后厨,后厨接收到订单需求后开始做菜;

  • 订单:命令(Command)
  • 服务员:命令的发送者(Invoker)
  • 后厨:命令接收者(Receiver)

  • 1)命令接收者:
package com.pattern.demo01_手动实现观察者设计模式;

/**
* @author lscl
* @version 1.0
* @intro: 厨师(命令接收者)
*/
public class CookReceiver {
public void menu1(){
System.out.println("厨师接到指令......");
System.out.println("炒了一盘辣椒炒肉~");
System.out.println("--------------------");
}

public void menu2(){
System.out.println("厨师接到指令......");
System.out.println("炒了一盘粉蒸肉~");
System.out.println("--------------------");
}

public void menu3(){
System.out.println("厨师接到指令......");
System.out.println("炒了一盘藜蒿腊肉~");
System.out.println("--------------------");
}
}
  • 2)抽象命令:
package com.pattern.demo01_手动实现观察者设计模式;

/**
* @author lscl
* @version 1.0
* @intro: 抽象菜单,规范客户要点的菜(命令角色,规范客户端能请求什么命令)
*/
public interface IMenuCommand {
void command();
}
  • 3)具体命令-1:
package com.pattern.demo01_手动实现观察者设计模式;

/**
* @author lscl
* @version 1.0
* @intro: 具体菜单(具体命令角色)
*/
public class Menu1Command implements IMenuCommand{

// 包含命令执行接收者(用于执行具体的命令)
private CookReceiver cookReceiver;

public Menu1Command(CookReceiver cookReceiver) {
this.cookReceiver = cookReceiver;
}

@Override
public void command() {
// 最终还是接收者来执行具体的命令(最终还是厨师来炒菜)
cookReceiver.menu1();
}
}
  • 4)具体命令-2:
package com.pattern.demo01_手动实现观察者设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Menu2Command implements IMenuCommand {
// 包含命令执行接收者(用于执行具体的命令)
private CookReceiver cookReceiver;

public Menu2Command(CookReceiver cookReceiver) {
this.cookReceiver = cookReceiver;
}

@Override
public void command() {
cookReceiver.menu2();
}
}
  • 5)命令请求/发送者:
package com.pattern.demo01_手动实现观察者设计模式;

/**
* @author lscl
* @version 1.0
* @intro: 服务员,接收客人的请求(命令请求者,接收客户端的指令)
*/
public class WaiterInvoker {

// 服务员具具备发送请求功能,发送请求给厨师进行炒菜
private IMenuCommand menuCommand;

public WaiterInvoker(IMenuCommand menuCommand) {
this.menuCommand = menuCommand;
}

public void execute(){
// 最终把命令发送给厨师
menuCommand.command();
}

}
  • 6)测试代码:
package com.pattern.demo01_手动实现观察者设计模式;

/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01 {
public static void main(String[] args) {

// 创建一个厨师(命令接收者,最终由厨师来执行命令)
CookReceiver cookReceiver=new CookReceiver();

// 创建一个服务员(命令请求者,由服务员来发送命令)
WaiterInvoker waiterInvoker=new WaiterInvoker(new Menu1Command(cookReceiver));
waiterInvoker.execute();

waiterInvoker=new WaiterInvoker(new Menu2Command(cookReceiver));
waiterInvoker.execute();
}
}

18.3 命令设计模式的优缺点

  • 优点:
  • 1)解耦了命令请求与实现
  • 2)可以在现有命令的基础上,增加额外功能,结合装饰模式会更加灵活
  • 缺点:
  • 1)使用命令模式造成具体命令类增多,系统结构更加复杂


标签:cookReceiver,18,命令,println,设计模式,public,out
From: https://blog.51cto.com/u_15919174/5959168

相关文章

  • 06【工厂设计模式】
    文章目录​​六、工厂设计模式​​​​6.1简单工厂设计模式​​​​6.1.1设计需求​​​​6.1.2使用接口改进代码​​​​6.1.3使用简单工厂再改进​​​​6.1.4简单工......
  • 07【建造者设计模式】
    文章目录​​七、建造者设计模式​​​​7.1建造者设计模式简介​​​​7.2建造者设计模式的实现​​​​7.2.1案例引入​​​​1)UML类图如下:​​​​2)建造者设计模式中......
  • 2022年12月18日晚19:30足球赛总结
    今天是世界杯决赛日,北京时间23点开球,而我们滨江队与中联的比赛提前于19:30开始。中联是一个劲敌,实力强悍,但是我认为并没有五条友球队强。这次的比赛场地是熟悉的水口劲......
  • 08【代理设计模式】
    文章目录​​八、代理设计模式​​​​8.1结构型设计模式简介​​​​8.2代理设计模式简介​​​​8.2.1代理设计模式概述​​​​8.2.2代理设计模式的UML类图​​​​8......
  • 09【享元设计模式】
    九、享元设计模式9.1享元设计模式简介9.1.1享元设计模式概述享元模式(FlyweightPattern):享元模式主要的任务就是减少对象创建的数量,其宗旨是共享细粒度的对象,将多个对同一......
  • 设计模式-责任链模式
    概念责任链模式是一种行为设计模式就是将一个东西(入参)按步骤顺序处理每一个步骤(一个个实际处理入参的对象:可以抽出公共的接口或抽象类)对应相应的处理方式东西通过......
  • #yyds干货盘点#Linux使用最频繁的命令:ls 命令
    ls命令介绍ls命令是英文list的简写形式。我们用它来列出文件。它的用法就是在任何目录下直接执行ls,或者在ls后接目录路径(包括相对路径和绝对路径)。当然我们还可以使用......
  • java命令--jmap命令使用
    jdk安装后会自带一些小工具,jmap命令(JavaMemoryMap)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。jmap命令可以获......
  • 设计模式,mvc,mvp,mvvm
    mvcmodel模型-视图view-控制器controller视图可以直接访问模型,所以视图里面包括模型信息,mvc关注的是模型不变,所以在mvc中,模型不依赖视图,但是view是依赖model的原理:模......
  • 【软硬件环境配置】ubuntu20.04系统安装VMware虚拟机和ubuntu18.04
    前言操作步骤1. 下载虚拟机;下载最新版本的VmwareworkstationPro17;WindowsVM|WorkstationPro|VMware2.下载ubuntu18.04镜像;UbuntuReleasesubunt......