行为类模式(二):命令(Command)

定义

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

UML

优点

  1. 能比较容易的设计一个命令队列
  2. 可以较容易的将命令加入日志
  3. 允许接收请求的一方是否处理请求
  4. 可以容易的实现对请求的添加和删除
  5. 加进新的具体命令类不会影响到其他的类,增加具体命令类很容易
  6. 把请求一个操作的对象与指导怎么执行一个操作对象分开(解耦)

缺点

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

应用场景

  1. 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
  2. 系统需要在不同的时间指定请求、将请求排队和执行请求。
  3. 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
  4. 系统需要将一组操作组合在一起,即支持宏命令。

示例

用命令模式模拟主机按下开机按钮后主机内部的开机流程。

Java

 1 public class Main
 2 {
 3     public static void main(String[] args)
 4     {
 5         //组装主机
 6         IMainBoard mainBoard = new GigaMainBoard();
 7         ICommand openCommand = new OpenCommand(mainBoard);
 8         Box box = new Box();
 9         box.setOpenCommand(openCommand);
10         //执行开机命令
11         box.openButtonPressed();
12     }
13 
14     /**
15      * 主板接口
16      */
17     public interface IMainBoard
18     {
19         /**
20          * 开机
21          */
22         void open();
23     }
24 
25     /**
26      * 技嘉主板
27      */
28     public static class GigaMainBoard implements IMainBoard
29     {
30         @Override
31         public void open()
32         {
33             System.out.println("技嘉主板当前正在开机");
34             System.out.println("接通电源");
35             System.out.println("设备检查");
36             System.out.println("装载系统");
37             System.out.println("机器开始运行起来");
38             System.out.println("已开机");
39         }
40     }
41 
42     /**
43      * 命令接口
44      */
45     public interface ICommand
46     {
47         /**
48          * 执行命令的操作
49          */
50         void execute();
51     }
52 
53     /**
54      * 主板开机命令
55      */
56     public static class OpenCommand implements ICommand
57     {
58         private IMainBoard mainBoard;
59         
60         public OpenCommand(IMainBoard mainBoard)
61         {
62             this.mainBoard = mainBoard;
63         }
64         
65         @Override
66         public void execute()
67         {
68             mainBoard.open();
69         }
70     }
71 
72     /**
73      * 机箱类
74      */
75     public static class Box
76     {
77         private ICommand openCommand;
78         
79         public void setOpenCommand(ICommand openCommand)
80         {
81             this.openCommand = openCommand;
82         }
83 
84         /**
85          * 按下开机按钮
86          */
87         public void openButtonPressed()
88         {
89             openCommand.execute();
90         }
91     }
92 }
View Code

 

转载于:https://www.cnblogs.com/hammerc/p/4743799.html

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

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

相关文章

win7 nginx mysql php_windows7配置Nginx+php+mysql的详细教程

最近在学习PHP,想把自己的学习经历记录下来,并写一些经验,仅供参考交流。此文适合那些刚刚接触PHP,想要学习并想要自己搭建NginxPHPMysqL环境的同学。当然,你也可以选择集成好的安装包,比如 wamp等&#xf…

我的虚拟化设想(My virtualization vision)

王洪岐(Wang Hongqi) 当前的服务器虚拟化技术所虚拟的操作系统都是完整的操作系统,我认为这样会在一定程度上造成了资源的浪费和技术难度的增加:多个操作系统就有多个操作硬件设备的操作程序,虚拟平台要在操作系统底层…

Kmplayer播放器 绿色免安装版 2016 中文版

软件名称: Kmplayer播放器 绿色免安装版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 42.8MB 图片预览: 软件简介: Kmplayer播放器绿色免安装版,多功能的影音播放…

什么是反向代理,如何区别反向与正向代理

转自:http://blog.csdn.NET/shixing_11/article/details/7106241 一直对反射代理的反向不知道如何理解,经过百度知道,再结合下面这幅图,总算弄清楚一点了。简单的说从一个局域网出来到服务端为正向,从客户端要进入一个…

java socket 浏览器_Socket实现Java和浏览器交互。

昨天写了段小程序,现贴出来看看。以下是socket的简单介绍。获取两台联通的机器之间的IP和端口号等信息。import java.io.IOException;import java.net.Socket;public class SockerDemo {public static void main(String[] args) throws IOException {Socket socket …

HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

Hashmap本质是数组加链表。根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面。 ConcurrentHashMap:在hashMap的基础上,ConcurrentHashMap将数据分为多个s…

[水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API

问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合到了 MVC 项目模板中。自 Visual Studio 2013 以后,创建 ASP.Net Web应用程序使用的是一种新的"One ASP.NET"项目…

java io流文件损坏_java使用io流下载.docx. xlsx文件,出现文件损坏提示

介绍在使用io流下载服务器上的资源文件时,出现以下提示:但是选择“是”后文件可以正常打开参考 代码如下:[codesyntax lang"java"]RequestMapping(value "downLoadInstruction")public void downLoadInstruction(HttpSe…

java 内存堆和栈_java堆内存和栈内存的处理

前段时间学习二叉树在处理删除操作的时候遇到一个头疼的问题:删除节点的时候明明已经置null了可树上该节点依旧存在,还必须执行node.father.left null;才可以删除node节点,寻找了一下原因发现还是因为对java内存管理理解不够深入。代码如下&…

python基础(十三)

项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机的IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功…

java面向_java是面向什么的语言?

Java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,…

java流的应用_Java中I/O流的应用

Java中I/O流的应用iLeGeNDpackagecom.hp.io;/** I/O流的应用 * 实现目标: * 首先创建一个文件 * 通过键盘向文件添加内容 * 然后把文件的内容打印到控制台 * */import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import ja…

PHP的反射类ReflectionClass、ReflectionMethod使用实例

PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。 反射是什么? 它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信…

java 多线程跑数据_java——多线程的实现方式、三种办法解决线程赛跑、多线程数据同步(synchronized)、死锁...

多线程的实现方式:demo1、demo2demo1:继承Thread类,重写run()方法packagethread_test;public class ThreadDemo1 extendsThread {ThreadDemo1(){}ThreadDemo1(String szName){super(szName);}//重载run函数public voidrun() {for(int count …

struts2-19-合法用户上传文件

一:登录页面 成功:--->upload.jsp 失败:返回错误信息(用户名或者密码错误) 二:上传文件 登录成功:上传成功 未登录:--->login.jsp错误信息(请登录) 三…

maven项目和普通项目转换

转载于:https://www.cnblogs.com/yver/p/6054131.html

Gradle用户指南(1)-Gradle安装

前置条件 Gradle 需要 Java JDK 或者 JRE,版本是 6 及以上。Gradle 将会装载自己的 Groovy 库,因此,Groovy 不需要被安装。任何存在的 Groovy 安装都会被 Gradle 忽略。 Gradle 使用你 path 中的 JDK,或者,您可以设置 java_home 环…

第十六章:Java内存模型——Java并发编程实战

一、什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中编译器中生成的指令顺序,可以与源代码中的顺序不同处理器采用乱序或并行的方…

二进制包 mysql_二进制包安装MySQL数据库

1.1二进制包安装MySQL数据库1.1.1 安装前准备(规范)[rootMysql_server ~]# mkdir -p /home/zhurui/tools ##创建指定工具包存放路径[rootMysql_server ~]# wget http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.5/mysql-5.5.32-linux2.6-x86_64.tar.gz ##下载二进制包[ro…

【转】String.format详解

一、前言                            String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", "John");,下面将笔记整理…