每天一个设计模式之命令模式(第二天)

news2024/11/17 13:06:31

交互模式中的命令模式,在开始记录之前,要讲些自己的感受,真真切切的感受到了悟性的瓶颈!一共十页书,需要自己细细琢磨品味,至少三四遍才大概了解了他们间的逻辑,我需要调整下自己的学习思路,我之前是先看一遍(没看懂)然后去照着代码复现一遍,然后再看,效率低的不行,两个半小时十页书籍,悟性极差哇。

开始今天的小记:

        先抓一下重点!找好它们之间的关联关系,通顺了之后,就可以小小的入门了。

        目的为了实现发送请求者和接收者的解耦,实现一个有限的技能页面,技能页面只能同时放五个技能,而我当前后台可能有几十个技能。后端要则么知道我前端点的哪个技能呢?做一一对应嘛?在哪儿做,有没有更好的设计模式可以实现呢,带着这个问题开始今天的小记

命令模式的本质,是对请求进行封装,一个请求对应一个命令,将发出命令的责任和执行命令的责任划分开

命令模式的关键,在于引入了抽象命令类,请求发送这针对于抽象命令类进行编程,只有实现了抽象命令类的具体命令才与请求接收者相关联

在命令模式中,发送者与接收者之间引入了新的命令对象,将发送者的请求封装在命令对象中,再通过命令对象来调用接收者的方法

一个调用者,并不需要再设计时确定其接收者,因此他只与抽象命令类之间存在关联关系,在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute方法,
实现间接调用请求者的相关操作

上面这四句话,是我摘抄书上的原话,理解了很久,终于结合代码可以梳理明白了,下面我会写出类相关的关系。

例子
FBSettingWindow是“功能键设置”界面类,
FunctionButton充当请求调用者,
Command充当抽象命令类,
MinimizeCommand和HelpCommand充当具体命令类,
WindowHandler和HelpHandler充当请求接收者。

FBSettingWindow就相当于是我们的技能页面

FunctionButton 就是那一个个技能按钮

Command就是技能实现的抽象类

MinimizeCommand和HelpCommand就是链接技能效果的中间点

WindowHandler和HelpHandler充当请求接收者。

WindowHandler和HelpHandler就是技能的效果

完整代码如下:

<?xml version = "1.0"?>
<config>
    <className>com.book.com.cor.command.test.HelpCommand</className>
    <className>com.book.com.cor.command.test.MinimizeCommand</className>
</config>

关联关系图:

package com.book.com.cor.command.test;

/**
 * @author liums
 * @date 2024/7/28 16:10
 * @description Client
 */
public class Client {
    public static void main(String[] args) {
        FBSettingWindows fb = new FBSettingWindows("功能键设置"); //

        FunctionButton fb1,fb2;
        fb1 = new FunctionButton("功能键1");
        fb2 = new FunctionButton("功能键2");

        Command command1,command2;
        // 通过读取配置文件和反射生成具体命令对象
        command1 =(Command) XMLUtil.getBean(0);
        command2 =(Command) XMLUtil.getBean(1);

        // 将命令对象注入功能键
        fb.addFunctionButton(fb1);
        fb.addFunctionButton(fb2);
        fb.display();

        // 调用功能键的业务方法
        fb1.onClick();
        fb2.onClick();
    }
}
package com.book.com.cor.command.test;


import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

/**
 * @author liums
 * @date 2024/7/28 15:57
 * @description XMLUtil 该方法用于从xml文件中提取具体类类名,兵返回一个实例对象,可以通过参数的不同返回不同的实例
 */
public class XMLUtil {
    public static Object getBean(int i) {
        try {
            // 创建文档对象

            DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dfactory.newDocumentBuilder();

            Document doc;


            doc = builder.parse(new File("src/main/resources/config.xml"));

            // 获取包含类名的文本节点
            NodeList nl = doc.getElementsByTagName("className");
            Node classNode = null;

            if (0 == i){
               classNode =  nl.item(0).getFirstChild();
            }else {
                classNode =  nl.item(1).getFirstChild();
            }

            String cName = classNode.getNodeValue();

            // 通过类名生成实例对象,并且将其返回
            Class c = Class.forName(cName);
            Object o = c.newInstance();
            return o;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

}
package com.book.com.cor.command.test;

/**
 * @author liums
 * @date 2024/7/28 15:55
 * @description WindowsHandler
 */
public class WindowsHandler {

    public void minimize(){
        System.out.println("将窗口最小化至托盘!");
    }
}
package com.book.com.cor.command.test;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author liums
 * @date 2024/7/28 15:54
 * @description MinimizeCommand
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class MinimizeCommand extends Command{
    private WindowsHandler whObj;

    @Override
    public void execute() {
        whObj = new WindowsHandler();
    }
}
package com.book.com.cor.command.test;

/**
 * @author liums
 * @date 2024/7/28 15:53
 * @description HelpHandler
 */
public class HelpHandler {

    public void display(){
        System.out.println("显示帮助文档");
    }
}
package com.book.com.cor.command.test;

/**
 * @author liums
 * @date 2024/7/26 22:24
 * @description 抽象命令类,请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才能和请求接收者相关联
 */
abstract class Command {

    public abstract void execute();
}
package com.book.com.cor.command.test;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;

/**
 * @author liums
 * @date 2024/7/28 15:44
 * @description FBSettingWindows
 */

public class FBSettingWindows {

    private String title;

    // 储存所有功能键
    private ArrayList<FunctionButton> functionButtons = new ArrayList<FunctionButton>();

    public FBSettingWindows(String title) {
        this.title = title;
    }

    public void addFunctionButton(FunctionButton button){
        functionButtons.add(button);
    }

    public void removeButton(FunctionButton button){
        functionButtons.remove(button);
    }

    public void display(){
        System.out.println("窗口显示:"+this.title);
        System.out.println("显示功能键");
        for (FunctionButton functionButton : functionButtons) {
            System.out.println(functionButton.getName());
        }
        System.out.println("-----------------------------------");
    }

}

package com.book.com.cor.command.test;


import jdk.nashorn.internal.objects.annotations.Getter;
import jdk.nashorn.internal.objects.annotations.Setter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author liums
 * @date 2024/7/28 15:38
 * @description FunctionButton 请求发送者
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class FunctionButton {

    private Command command;
    private String name;

    public void onClick(){
        System.out.println("点击功能键:");
        command.execute();
    }

    public FunctionButton(String name) {
        this.name = name;
    }
}
package com.book.com.cor.command.test;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author liums
 * @date 2024/7/28 15:49
 * @description HelpCommand 帮助命令类:具体命令类
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class HelpCommand extends Command{

    private HelpHandler helpCommand;

    @Override
    public void execute() {
        helpCommand.display();
    }
}

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

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

相关文章

Lumos学习王佩丰Excel第七讲:认识公式与函数

一、认识Excel公式 1、运算符 运算符 作用 算术运算符 加 - 减 * 乘 / 除 % 百分比&#xff0c;相当于除以100 & 连接符&#xff0c;文本数字均可连接 ^ 乘方 比较运算符 等于 > 大于 < 小于 ≤ 小于等于 ≥ 大于等于 例1&#xff1…

python实现信号合成(DSP仿真系统)【1】

python实现信号合成(DSP仿真系统)【1】 1、效果图 2、功能结构 1、基础信号正弦波、脉冲函数、阶跃函数、斜坡函数、方波、sinc曲线、矩形波(非周期) 2、信号合成(叠加)叠加噪音 3、波形展示原始波形、叠加波形、FFT、PSD、卷积 4、各种滤波器4.1.限幅滤波器4.2.中位值滤…

【OSCP系列】OSCP靶机-BTRsys-2.1(原创)

OSCP系列靶机—BTRsys-2.1 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 3、服务系统探测 4、漏洞探测 80端口扫到了一些目录&#xff0c;有wordpress框…

CentOS7使用yum安装MySQL

废话不多说&#xff0c;直接上干货 1、CentOS7的yum源中默认是没有mysql的&#xff0c;我们先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2、安装mysql-community-release-el7-5.noarch.rpm包 sudo rpm -ivh mysql-community-r…

算法通关:007时间复杂度和空间复杂度:生成相邻两数不相等的数组

生成相邻两数不相等的数组 全部代码&#xff1a; import java.util.Arrays;/*** Author: ggdpzhk* CreateTime: 2024-07-28* 随机生成数组&#xff0c;比如每个元素都在0-3之间&#xff0c;且相邻两个元素不相同*/ public class _007 {public static void main(String[] args)…

Redis:管道

1. 面试题 如何优化频繁命令往返造成的性能瓶颈&#xff1f; 问题由来 edis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤&#xff1a; 1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听Socket…

Vue.js 2 项目实战(九):商品列表

前言 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它的设计初衷是通过采用简洁且强大的结构&#xff0c;使前端开发变得更简单和高效。以下是对 Vue.js 的详细介绍&#xff1a; 核心特性 声明式渲染 Vue.js 使用声明式语法来描述用户界面&#xff0c;通过数据绑…

力扣刷题----42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xf…

经验分享:大数据信用报告可以查到什么?哪里能查大数据?

相信不少人都因为大数据信用不良碰过壁&#xff0c;这时候不少人反过来想要了解大数据信用报告可以查到什么?哪里能查大数据?其实大数据信用报告就是通过对个人在互联网上产生的各类行为数据收集、整合和分析&#xff0c;并基于此对个人信用状况进行评估和预测的一种检测工具…

Java之快速排序

快速排序 快速排序(Quick Sort)算法&#xff0c;简称快排&#xff0c;利用的是分治的思想。 快速排序思路&#xff1a; ​ 如果要对 first->end 之间的数列进行排序&#xff0c;我们选择 first->end 之间的任意一个元素数据作为分区点(轴值Pivot)&#xff0c;然后遍历 f…

【Qt】QLabel常用属性相关API

QLabel是Qt框架中用于显示文本或图案的小部件。在Qt应用程序中&#xff0c;QLabel是用来呈现静态文本或图像给用户的重要部分 QLabel属性陈列 属性说明textQLabel中的文本内容textFormat 文本的格式 Qt::PlainText 纯文本Qt::RichText 富文本Qt::MarkdownText markdown…

Transformer--输入部分

&#x1f3f7;️上文我们简单介绍了Transformer模型的总体架构&#xff0c;本章我们主要介绍其输入部分 &#x1f4d6;前言 &#x1f4d6;文本嵌入层的作用 &#x1f4d6;位置编码器的作用 &#x1f4d6;前言 输入部分主要包括源文本嵌入层以及位置编码器&#xff0c;目标文本…

【Vulnhub系列】Vulnhub_SecureCode1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_SecureCode1靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境配置 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…

高效管理基础设施:掌握 Terraform 的 templatefile 函数技巧

由于Terraform的许可证变更&#xff0c;我曾经担心未来的动向&#xff0c;但IBM宣布收购HashiCorp后&#xff0c;我感到有所安心。我将继续关注相关动向。 本文将介绍Terraform的内置函数templatefile。 什么是templatefile函数&#xff1f; templatefile函数用于读取指定路…

Ip2region - 基于xdb离线库的Java IP查询工具提供给脚本调用

文章目录 Pre效果实现git clone编译测试程序将ip2region.xdb放到指定目录使用改进最终效果 Pre OpenSource - Ip2region 离线IP地址定位库和IP定位数据管理框架 Ip2region - xdb java 查询客户端实现 效果 最终效果 实现 git clone git clone https://github.com/lionsou…

用SQL将数值转换为进度条

hi&#xff0c;大家好呀&#xff01; 最近天气是真的热&#xff0c;上周我们在某音做了一次直播&#xff0c;主要是讲解一下表&#xff0c;那我们最近的会在视频号&#xff0c;也就是微信上给大家直播讲解一下查询&#xff0c;直播预告晚点会分享给大家&#xff0c;请大家关注…

队列queue介绍

队列是一种常见的数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;的原则&#xff0c;即最先进入队列的元素将最先被移除。队列在Java中有多种实现方式&#xff0c;其中包括&#xff1a; 1.ArrayDeque&#xff1a;这是一个基于数组的双端队列&#xff0c;可以在…

模拟实现短信登录功能 (session 和 Redis 两种代码实例) 带前端演示

目录 整体流程 发送验证码 短信验证码登录、注册 校验登录状态 基于 session 实现登录 实现发送短信验证码功能 1. 前端发送请求 2. 后端处理请求 3. 演示 实现登录功能 1. 前端发送请求 2. 后端处理请求 校验登录状态 1. 登录拦截器 2. 注册拦截器 3. 登录完整…

Boost_Searcher测试用例编写

功能描述&#xff1a; 用户在客户端页面&#xff0c;在搜索框输入关键词&#xff0c;页面将显示Boost库中所有包含该关键词的内容。 界面功能兼容性易用性安全性性能弱网安装/卸载 编写测试用例&#xff1a; 功能&#xff1a; 在浏览器搜索框中输入ip地址与端口号&#xff0…

MySQL的库操作和表操作

文章目录 MYSQLSQL语句分类服务器&#xff0c;数据库和表的关系 库操作表操作 MYSQL SQL语句分类 DDL【data definition language】 数据定义语言&#xff0c;用来维护存储数据的结构代表指令: create, drop, alterDML【data manipulation language】 数据操纵语言&#xff0…