研磨设计模式day12命令模式

news2024/12/23 7:10:27

目录

定义

几个参数

场景描述

代码示例

参数化设置

命令模式的优点

本质 

何时选用


定义

几个参数

Command:定义命令的接口。

ConcreteCommand:命令接口的实现对象。但不是真正实现,是通过接收者的功能来完成命令要执行的操作

Receiver:接收者。真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能

Invoker:要求命令对象执行请求,通常持有命令对象。

Client:创建具体的命令对象,并且设置命令对象的接收者。

场景描述

电脑开机:

机箱上的按钮就相当于是命令对象

机箱相当于是Invoker:要求机箱上的按钮执行哪些动作

主板相当于接收者对象:真正执行命令的对象

命令对象持有接收者对象就相当于按钮有一条线连接着主板,当按钮被按下就通过连接线把命令发出去。

代码示例

定义主板

package day12命令模式;

/**
 * 主板的接口
 */
public interface ZhuBanApi {
    /**
     * 定义一个功能:开机
     */
    public void open();
}

定义实现,定义两个一个是技嘉主板,一个是微星主板,现在将实现写为一样

不同的主板对同一个命令的操作可以是不同的

技嘉主板

package day12命令模式.Impl;

import day12命令模式.ZhuBanApi;

public class JiJiaZhuBanImpl implements ZhuBanApi {
    @Override
    public void open() {
        System.out.println("技嘉主板正在开机,请等候");
        System.out.println("接通电源......");
        System.out.println("设备检查......");
        System.out.println("装载系统......");
        System.out.println("机器正常运转......");
        System.out.println("机器已经正常打开,请操作");
    }
}

微星主板

package day12命令模式.Impl;

import day12命令模式.ZhuBanApi;

public class WeiXingZhuBanImpl implements ZhuBanApi {
    @Override
    public void open() {
        System.out.println("微星主板正在开机,请等候");
        System.out.println("接通电源......");
        System.out.println("设备检查......");
        System.out.println("装载系统......");
        System.out.println("机器正常运转......");
        System.out.println("机器已经正常打开,请操作");
    }
}

定义命令接口:里面只有一个方法就是执行

package day12命令模式;

/**
 * 命令接口,声明执行的操作
 */
public interface Command {
    /**
     * 执行命令对应的操作
     */
    public void execute();
}

命令实现:我们按下的是按钮,但是按钮本身不知道怎么去启动电脑,只有主板知道,所以我们要持有真正实现命令的接收者--主板对象

package day12命令模式.Impl;

import day12命令模式.Command;
import day12命令模式.ZhuBanApi;

/**
 * 开机命令接口的实现
 */
public class CommandImpl implements Command {
    /**
     * 持有真正实现命令的接收者--主板对象
     */
    private ZhuBanApi zhuBanApi = null;

    /**
     * 构造方法,传入主板对象
     * @param zhuBanApi
     */
    public CommandImpl(ZhuBanApi zhuBanApi){
        this.zhuBanApi = zhuBanApi;
    }

    /**
     * 实现开机
     */
    @Override
    public void execute() {
        this.zhuBanApi.open();
    }
}

提供机箱,按钮是放置在机箱上的。机箱对象,本身有按钮,持有按钮对应的命令对象也就是Command

package day12命令模式;

/**
 * 机箱对象,本身有按钮,持有按钮对应的命令对象
 */
public class Box {
    /**
     * 开机命令对象
     */
    private Command openCommand;

    /**
     * 设置开机命令对象
     * @param openCommand 开机命令对象
     */
    public void setOpenCommand(Command openCommand) {
        this.openCommand = openCommand;
    }
    /**
     * 提供给客户使用,接收并相应用户请求,相当于那妞被按下触发的方法
     */
    public void openButton(){
        openCommand.execute();
    }
}

客户使用按钮,把与主板连接好的按钮对象放置在机箱上。

package day12命令模式;

import day12命令模式.Impl.CommandImpl;
import day12命令模式.Impl.WeiXingZhuBanImpl;

public class Client {
    public static void main(String[] args) {
        // 1.创建接收者
        WeiXingZhuBanImpl zhuban = new WeiXingZhuBanImpl();

        // 2.设置接收者与命令对象的关系  (按钮要进行开机,使用哪个主板)
        CommandImpl command = new CommandImpl(zhuban);

        // 3.创建Invoker,用Invoker来执行命令
        Box box = new Box();
        // 4.将2中绑定好关系的命令对象设置到Invoker中,让Invoker持有
        box.setOpenCommand(command);

        // 5.调用Invoker中的方法,触发要求执行命令
        // Box定义了方法,,用持有命令对象接口里面的方法,接口的实现中持有真正实现命令的接收者ZhuBanApi,
        // ZhuBanApi他去调用真正的开机方法,而这个接口有多个实现类,到底调用哪一个呢?
        // 因为在创建接收者时已经把微星这个接收者与命令对象绑定起来了,所以用的就是微星的实现类
        box.openButton();
    }
}

解析:先new一个主板,主板要跟按钮连接成为一个具体的开机命令,我又new一个机箱,把这个升级过的按钮(带有功能)装到这个机箱上,机箱最后调用这个按钮。

1.会发现命令模式的关键之处就是把请求封装成了对象,也就是命令对象,并定义了统一的执行操作的接口。

2.在命令模式中会有一个组装者,他来维护虚实现与真实实现之间的关系

参数化设置

可以用不同的命令对象,去参数化配置客户的请求

定义主板接口,现在增加一个重启的按钮,因此主板加一个方法来实现重启功能

package day12命令模式;

/**
 * 主板的接口
 */
public interface ZhuBanApi {
    /**
     * 定义一个功能:开机
     */
    public void open();
    /**
     * 定义重启功能
     */
    public void reset();
}

 实现类也要改一下

技嘉的

package day12命令模式.Impl;

import day12命令模式.ZhuBanApi;

/**
 * 主板的实现
 */
public class JiJiaZhuBanImpl implements ZhuBanApi {
    @Override
    public void open() {
        System.out.println("技嘉主板正在开机,请等候");
        System.out.println("接通电源......");
        System.out.println("设备检查......");
        System.out.println("装载系统......");
        System.out.println("机器正常运转......");
        System.out.println("机器已经正常打开,请操作");
    }

    @Override
    public void reset() {
        System.out.println("技嘉主板现在正在重新启动机器,请等候");
        System.out.println("机器已经正常打开,请操作");
    }
}

微星的

package day12命令模式.Impl;

import day12命令模式.ZhuBanApi;

/**
 * 主板的实现
 */
public class WeiXingZhuBanImpl implements ZhuBanApi {
    @Override
    public void open() {
        System.out.println("微星主板正在开机,请等候");
        System.out.println("接通电源......");
        System.out.println("设备检查......");
        System.out.println("装载系统......");
        System.out.println("机器正常运转......");
        System.out.println("机器已经正常打开,请操作");
    }

    @Override
    public void reset() {
        System.out.println("微星主板现在正在重新启动机器,请等候");
        System.out.println("机器已经正常打开,请操作");
    }
}

接下来定义命令和按钮,接口不变,添加一个重启命令的实现resetCommandImpl

package day12命令模式.Impl;

import day12命令模式.Command;
import day12命令模式.ZhuBanApi;

public class ResetCommandImpl implements Command {
    /**
     * 持有主板,也就是接收者对象
     */
    private ZhuBanApi zhuBanApi;

    /**
     * 构造函数传入
     * @param zhuBanApi
     */
    public ResetCommandImpl(ZhuBanApi zhuBanApi){
        this.zhuBanApi = zhuBanApi;
    }
    @Override
    public void execute() {
        this.zhuBanApi.reset();
    }
}

Box改造一下,这里增加一个重启命令对象

package day12命令模式;

/**
 * 机箱对象,本身有按钮,持有按钮对应的命令对象
 */
public class Box {
    /**
     * 开机命令对象
     */
    private Command openCommand;

    /**
     * 重启命令对象
     */
    private Command resetCommand;

    public void setResetCommand(Command resetCommand) {
        this.resetCommand = resetCommand;
    }

    /**
     * 设置开机命令对象
     * @param openCommand 开机命令对象
     */
    public void setOpenCommand(Command openCommand) {
        this.openCommand = openCommand;
    }

    /**
     * 提供给客户使用,接收并相应用户请求,相当于按钮被按下触发的方法
     */
    public void openButton(){
        openCommand.execute();
    }

    /**
     * 重启按钮
     */
    public void resetButton(){
        resetCommand.execute();
    }
}

Client

package day12命令模式;

import day12命令模式.Impl.OpenCommandImpl;
import day12命令模式.Impl.ResetCommandImpl;
import day12命令模式.Impl.WeiXingZhuBanImpl;

public class Client {
    public static void main(String[] args) {

        WeiXingZhuBanImpl zhuban = new WeiXingZhuBanImpl();


        OpenCommandImpl openCommand = new OpenCommandImpl(zhuban);
        ResetCommandImpl resetCommand = new ResetCommandImpl(zhuban);


        Box box = new Box();
        box.setOpenCommand(openCommand);
        box.setResetCommand(resetCommand);

        System.out.println("正确配置");
        System.out.println(">>>按下开机按钮:>>>");
        box.openButton();
        System.out.println(">>>按下重启按钮:>>>");
        box.resetButton();
    }
}

命令模式的优点

本质 

命令模式的本质:封装请求

何时选用

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/929996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

桌面软件开发框架

一、Qt 官网:https://www.qt.io/ C 领域最流行的跨平台桌面端软件开发框架,Qt 有界面描述语言(XML 描述界面),可以通过设计器拖拽空间设计界面,编译期界面描述语言被转义成 C 代码 Python 基于 PyQt 做 Q…

【android12-linux-5.1】【ST芯片】驱动与HAL移植后数据方向异常

ST的传感器驱动与HAL一直成功后,能拿到数据了,但是设备是横屏,系统默认是竖屏。就会出现屏幕自动转动时方向是错的的情况,设备横立展示的是竖屏,设备竖立展示的是横屏。 这个是PCB上设计的传感器贴片方向和横屏不一致…

Linux:基础指令

目录 Linux的基础指令 1.ls指令 2.pwd指令 3.cd指令 4.touch指令 5.mkdir指令 6.rmdir指令和rm指令 7.man指令(重要) 8.cp指令(重要) 9.mv指令(重要) 10.cat指令 11.nano指令 12.more指令 13.…

7个用于机器学习和数据科学的基本 Python 库

推荐:使用 NSDT场景编辑器 助你快速搭建3D应用场景 这篇文章针对的是刚开始使用Python进行AI的人,以及那些有经验的人,但对下一步要学习什么有疑问的人。我们将不时花点时间向初学者介绍基本术语和概念。如果您已经熟悉它们,我们鼓…

Moonbeam生态跨链互操作项目汇总

立秋已过,今年的夏天已经接近尾声,即将迎来凉爽的秋天。Moonbeam生态一同以往持续成长,在8月也举办了不少活动、完成集成合作以及协议更新。让我们一同快速了解Moonbeam生态项目近期发生的大小事件吧! Moonwell Moonwell是一个建…

《Kubernetes故障篇:Container runtime network not ready》

一、环境信息 操作系统K8S版本containerd版本Centos7.6v1.24.17v1.6.12 二、背景信息 1、通过以下命令检查网络插件的状态,发现网络插件coredns处于pending状态 2、通过以下命令检查kubelet服务状态,发现Container runtime network not ready等报错 三…

yolov5添加SimAM注意力机制(yolov7同理)

SimAM注意力机制简介 关于SIMAM注意力机制的原理这里不再详细解释,这篇发在Proceeddings of the 38th Internation Conference on Machine Learning.论文参考如下论文链接here   yolov5中添加SimAM注意力机制 注意力机制分为接收通道数和不接受通道数两种。这次属于不接受通…

自制编程语言基于c语言实验记录之二:总结三四五六七章之编译类定义

博客前言 由于本书第六七章是编译脚本语言sparrow生成指令、虚拟机运行指令的核心章节,需要连在一起理解,同时三四五章都是六七章的铺垫,所以专门写多篇博客来记录六七章。 同时本书相比《操作系统真相还原》缺少具体例子很难梳理项目整体代…

如何解决“缺失msvcp110.dll”错误,msvcp110.dll丢失要怎样才能修复

今天,我将为大家分享关于电脑提示msvcp110.dll丢失的3种修复方法。希望这些方法能帮助到正在遇到这个问题的朋友们。 首先,我们来了解一下msvcp110.dll文件的作用。msvcp110.dll是Microsoft Visual C 2010 Redistributable Package的一部分,…

【android12-linux-5.1】【ST芯片】HAL移植后没调起来

ST传感器芯片HAL按官方文档移植后&#xff0c;测试一直掉不起来&#xff0c;加的日志没出来。经过分析&#xff0c;是系统自带了一个HAL&#xff0c;影响的。 按照官方文档&#xff0c;移植HAL后&#xff0c;在/device/<vendor\>/<board\>/device.mk*路径增加PROD…

leetcode刷题(字符串相加、包含每个查询的最小区间、模拟行走机器人、环形子数组的最大和、满足不等式的最大值、四数之和、树中距离之和)

目录 1、字符串相加 2、包含每个查询的最小区间 3、模拟行走机器人 4、环形子数组的最大和 5、满足不等式的最大值 6、四数之和 7、 树中距离之和 1、字符串相加 class Solution:def addStrings(self, num1: str, num2: str) -> str:i len(num1) - 1 # num1的末…

温故知新之:代理模式,静态代理和动态代理(JDK动态代理)

0、前言 代理模式可以在不修改被代理对象的基础上&#xff0c;通过扩展代理类&#xff0c;进行一些功能的附加与增强。 1、静态代理 静态代理是一种代理模式的实现方式&#xff0c;它在编译期间就已经确定了代理对象&#xff0c;需要为每一个被代理对象创建一个代理类。静态代…

Spring与MyBatis集成 AOP整合PageHelper插件

目录 1.什么是集成&#xff1f; 2.Spring与MyBatis集成 3.Spring与MyBatis集成的基本配置 4.AOP整合PageHelper插件 1.什么是集成&#xff1f; 集成是指将不同的组件、框架或系统整合到一起&#xff0c;使它们可以协同工作、相互调用、共享资源等。通过集成&#xff0c;可以…

浏览器的事件循环

其实在我们电脑的操作系统中&#xff0c;每一个运行的程序都会由自己的进程&#xff08;可能是一个&#xff0c;也可能有多个&#xff09;&#xff0c;浏览器就是一个程序&#xff0c;它的运行在操作系统中&#xff0c;拥有一组自己的进程&#xff08;主进程&#xff0c;渲染进…

咸虾米之一些快捷方式的操作,一行方块的左右滑动,方块在一区域内的任意移动

由于本着只学习微信小程序的目的&#xff0c;上面的几篇博文都是跟着黑马程序的课程走的&#xff01;后面的就讲解uni-app的实验呢&#xff01;一个人的精力是有限的&#xff0c;于是换了们课程继续深造微信小程序&#xff01;&#xff01;&#xff01; 以下是在 .wxml中的一些…

leetcode 541.反转字符串II

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;https://leetcode.cn/problems/reverse-string-ii/ ps&#xff1a; 这道题描述的有点晦涩难懂&#xff0c;意思就是每隔k个反转k个&#xff0c;末尾不够k个时全部反转&#xff0c;开始就不够k个也全部反转。 代码&#…

C++day5(静态成员、类的继承、多继承)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.静态数据成员静态成员函数&#xff08;银行账户实例&#xff09; #include <iostream>using namespace std;class BankAccount { private:double balance; //余额static double interest_rate; //利率 p…

本地部署 Stable Diffusion(Mac 系统)

在 Mac 系统本地部署 Stable Diffusion 与在 Windows 系统下本地部署的方法本质上是差不多的。 一、安装 Homebrew Homebrew 是一个流行的 macOS &#xff08;或 Linux&#xff09;软件包管理器&#xff0c;用于自动下载、编译和安装各种命令行工具和应用程序。有关说明请访问官…

创建K8s pod Webhook

目录 1.前提条件 2.开始创建核心组件Pod的Webhook 2.1.什么是Webhook 2.2.在本地k8s集群安装cert-manager 2.3.创建一个空的文件夹 2.4. 生成工程框架 2.5. 生成核心组件Pod的API 2.6.生成Webhook 2.7.开始实现Webhook相关代码 2.7.1.修改相关配置 2.7.2.修改代码 2…

2023最新AI创作系统ChatGPT网站源码V2.6.0+详细图文搭建安装教程/GPT联网/支持ai绘画+Dall-E2绘画/支持MJ以图生图

一、AI系统 如何搭建部署AI创作ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01; SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 程序核心功能 程序已支持ChatGPT3.5/4.0提问、AI绘画、Midjourney绘画&#xff08;…