16-Java命令模式 ( Command Pattern )

Java命令模式

    • 摘要
    • 实现
    • 范例

  • 命令模式(Command Pattern)中请求以命令的形式包裹在对象中,并传给调用对象

  • 调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令

命令模式是行为型模式,一种数据驱动的设计模式

摘要

1. 意图

  • 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化

2. 主要解决

  • 在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适

3. 何时使用

  • 在某些场合,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者”与”行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合

4. 如何解决

  • 通过调用者调用接受者执行命令,顺序:调用者→接受者→命令

5. 关键代码

定义三个角色:

  1. received真正的命令执行对象;
  2. Command;
  3. invoker使用命令对象的入口;

6. 应用实例

  • struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command

7. 优点

  • 降低了系统耦合度;
  • 新的命令可以很容易添加到系统中去;

8. 缺点

  • 使用命令模式可能会导致某些系统有过多的具体命令类

9. 使用场景

  • 几乎所有是命令的地方都可以使用命令模式;
    • GUI中每一个按钮都是一条命令;
    • 模拟CMD;

10. 注意事项

  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展

实现

在这里插入图片描述

  1. 定义一个命令的接口Order;
  2. 定义作为请求的Stock类;
  3. 定义实体命令类BuyStock和SellStock,实现了Order接口,执行实际的命令处理;
  4. 定义作为调用对象的类Broker,它接受订单并能下订单,Broker对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令;
  5. 定义类CommandPatternDemo使用Broker类来演示命令模式;

范例

1.创建一个命令接口.

Order.java

package com.demo.gof;
public interface Order {void execute();
}

2. 创建一个请求类

Stock.java

package com.demo.gof;
public class Stock {private String name = "ABC";private int quantity = 10;public void buy(){System.out.println("Stock [ Name: "+name+", Quantity: " + quantity +" ] bought");}public void sell(){System.out.println("Stock [ Name: "+name+", Quantity: " + quantity +" ] sold");}
}

3. 创建实现了 Order 接口的实体类

BuyStock.java

package com.demo.gof;
public class BuyStock implements Order {private Stock abcStock;public BuyStock(Stock abcStock){this.abcStock = abcStock;}public void execute() {abcStock.buy();}
}

SellStock.java

package com.demo.gof;
public class SellStock implements Order {private Stock abcStock;public SellStock(Stock abcStock){this.abcStock = abcStock;}public void execute() {abcStock.sell();}
}

4. 创建命令调用类

Broker.java

package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class Broker {private List<Order> orderList = new ArrayList<Order>(); public void takeOrder(Order order){orderList.add(order);     }public void placeOrders(){for (Order order : orderList) {order.execute();}orderList.clear();}
}

5. 使用 Broker 类来接受并执行命令

CommandPatternDemo.java

package com.demo.gof;
public class CommandPatternDemo {public static void main(String[] args) {Stock abcStock = new Stock();BuyStock buyStockOrder = new BuyStock(abcStock);SellStock sellStockOrder = new SellStock(abcStock);Broker broker = new Broker();broker.takeOrder(buyStockOrder);broker.takeOrder(sellStockOrder);broker.placeOrders();}
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/CommandPatternDemo.java
$ java  com.ddkk.gof.CommandPatternDemo
Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙APP开发实现汽车遥控钥匙解锁汽车智能时代

在现代社会&#xff0c;随着科技的不断发展&#xff0c;汽车已经不再是简单的交通工具&#xff0c;而是与智能科技紧密相连的载体。其中&#xff0c;通过开发APP蓝牙程序实现汽车遥控钥匙成为了一种趋势&#xff0c;为车主带来了便捷与安全的体验。虎克技术公司作为行业领先者&…

数据库总结

文章目录 自适应hash&#xff1a; 采用自适应 Hash 索引目的是方便根据 SQL 的查询条件加速定位到叶子节点&#xff0c;特别是当 B 树比较深的时候&#xff0c;通过自适应 Hash 索引可以明显提高数据的检索效率。 页目录&#xff1a; 页目录其实就是给页做了个目录&#xff0c…

实现消息队列(Kafka、ActiveMQ、RabbitMQ和RocketMQ)高可用

概述 单机没有高可用可言&#xff0c;高可用都对集群来说的 要保证消息队列系统&#xff08;如Kafka、ActiveMQ、RabbitMQ和RocketMQ&#xff09;的高可用性&#xff0c;可以采取以下一些通用的措施&#xff1a; 集群部署&#xff1a;将消息队列系统部署为集群&#xff0c;包…

2-web端管理界面使用rabbitmq

Web管理界面可以直接操作RabbitMQ&#xff0c;下面进行操作并记录步骤 1、添加交换器&#xff1a; Add a new exchange 中&#xff0c;Name是交换器名称&#xff0c;Type是交换器类型&#xff0c;有direce、fanout、heders、topic 4种。 这里先只填Name和选个类型&#xff0c;…

寒假作业Day 07

寒假作业Day 07 一、选择题 函数rewind的作用是使文件位置指针重新返回文件的开始位置。这是C语言程序中的库函数&#xff0c;它针对的是文件内部的位置指针&#xff0c;而不是文件指针。文件内部的位置指针会随着对文件的读写操作而向后移动&#xff0c;而文件指针则是指向整…

【考研数学】武忠祥各阶段用书搭配+学习包

25考研数学全流程规划&#xff01;别等到二战了才知道这样学 本人属于基础很差相当于是零基础的考研党&#xff0c;经过一年备考成功上岸 中间花费了很多时间在考研数学备考信息检索上&#xff0c;写下这篇希望能帮助基础不好的学弟学妹们多节约一些时间复习&#xff01; 25…

Sealos 给全体用户献上开春福利!降价 33.5%~73.4%

Sealos 经过 23 年一年的迭代&#xff0c;获得了用户的广泛好评&#xff0c;注册用户已破十万&#xff0c;应用数量也突破一万&#xff0c;24 年的工作重心会放在价格上&#xff0c;在我们不死掉的情况下尽可能为用户谋福利&#xff01; 好消息是 Sealos 与各大云厂商深度合作…

【学习笔记】数据结构与算法06 - 堆:上堆、下堆、Top-K问题以及代码实现

知识来源&#xff1a;https://www.hello-algo.com/chapter_heap/heap/#4 文章目录 2.5 堆2.5.1 堆&#xff08;优先队列2.5.1.1 堆的常用操作 2.5.2 堆的存储与表示2.5.2.1 访问堆顶元素2.5.2.2 入堆时间复杂度 2.5.2.3 堆顶元素出堆时间复杂度 2.5.3 堆的常见应用2.5.4 建堆问…

day13_微服务监控Nginx(微服务集成SBA)

文章目录 1 微服务系统监控1.1 监控系统的意义1.2 SBA监控方案1.3 SBA实战1.3.1 创建SBA服务端1.3.2 微服务集成SBA 1.4 微服务集成logback1.5 配置邮件告警 2 Nginx2.1 Nginx简介2.2 下载和安装2.2.1 方式1&#xff1a;window本地安装2.2.1.1 下载2.2.1.2 安装2.2.1.3 目录结构…

小火星露谷模组管理页面简介

1. 已有详细介绍的功能 模组管理页面部分功能已经有较为详细的介绍&#xff1a; 添加模组&#xff1a;https://svmbbs.smallfire.cn/d/15-dian-nao-zhong-yi-jing-you-duo-ge-mo-zu-ya-suo-wen-jian-ru-he-pi-liang-an-zhuang一键更新模组&#xff1a;https://svmbbs.smallfi…

推理判断-聂佳-图形2

1、数量规律-点数量 总结&#xff1a; 1.数奇点 2.算笔画 题目 直线题目 2、数量规律-面 知识点讲解 题目 3、数量规律-素数量 知识点讲解 题目 4、空间重构-相对面 知识点讲解 ​​​​​​ 总结 题目 课后测验

哪些公司在招聘GIS开发?为什么?

之前我们给大家整理汇总了WebGIS在招岗位的一些特点&#xff0c;包括行业、学历、工作经验等。WebGIS招聘原来看重这个&#xff01;整理了1300多份岗位得出来的干货&#xff01; 很多同学好奇&#xff0c;这些招GIS开发的都是哪些公司&#xff1f;主要是做什么的&#xff1f; …