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

  在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。

命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求,这就是命令模式的动机。

例如: 当我们进行电脑开机时,我们只需要按下开机键也就是发送开机命令,不管我们用的台式机还是笔记本、惠普的还是联想的,,我们只需要知道开机命令并且发送它,具体谁执行开机命令我们并不关心。

定义主板:

public interface MainBoard {
public void open();
}

定义主板实现类:

 public class GigaMainBoard implements MainBoard {

     @Override
public void open() {
System.out.println("主板正在开机...");
System.out.println("机器已经正常打开,请操作...");
} }

定义命令接口:

public interface Command {
public void excute();
}

定义命令的具体实现类:

 /**
* 持有真正实现命令的接收者----主板对象
* @author Administrator
*
*/ public class OpenCommand implements Command { private MainBoard mainboard = null;
/*
* 构造方法,传入主板对象
*/ public OpenCommand(MainBoard mainboard) {
super();
this.mainboard = mainboard;
} @Override
public void excute() {
//对于命令对象,根本不知道如何开机,回转调主板对象
//让主板去完成开机的功能
this.mainboard.open();
} }

提供机箱:

 public class Box {
/**
*开机命令对象
*/
private Command opencommend;
/**
* 设置开机命令对象
*/
public void setOpencommend(Command opencommend) {
this.opencommend = opencommend;
}
/**
* 提供给客户使用,接收并响应用户请求,相当于按钮被按下的触发方法
*/
public void openButtonPressed() {
//按下按钮,执行命令
opencommend.excute();
} }

客户测试:

 public class CommandPattern {

     public static void main(String[] args) {
//1.把命令和真正的实现组合起来,相当于在组装机器
//把机箱上按钮的连接线插接到主板上 //定义主板
MainBoard mainBoard = new GigaMainBoard();
//定义开机命令,为开机命配备具体主板
OpenCommand openCommand = new OpenCommand(mainBoard); //2.为机箱上的按钮设置对应的命令,让按钮知道该干什么 //定义机箱(开机按钮)
Box box = new Box();
//为机箱设置开机命令
box.setOpencommend(openCommand); //3.然后模拟按下机箱上的按钮
box.openButtonPressed();
} /*
* 在客户测试步骤中我们可以发现,机箱与主板并无直接的关系,中间由开机命令链接
* 机箱只知道可以机箱发送开机的命令有对象去执行,不需要知道执行命令的主板是哪个
*/
}

运行结果:

主板正在开机...
机器已经正常打开,请操作...
惠普的还是联想的,
[Huìpǔ de háishì liánxiǎng de,]
HP or Lenovo,
 

命令模式(Command、Recevier、Invoker)(电脑开机命令)的更多相关文章

  1. 命令模式 Command 行为型 设计模式(十八)

    命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...

  2. 设计模式(六):控制台中的“命令模式”(Command Pattern)

    今天的博客中就来系统的整理一下“命令模式”.说到命令模式,我就想起了控制台(Console)中的命令.无论是Windows操作系统(cmd.exe)还是Linux操作系统(命令行式shell(Comm ...

  3. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  4. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  5. 命令模式(Command Pattern)

    命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式.命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求 ...

  6. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  7. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

  8. 《JAVA设计模式》之命令模式(Command)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...

  9. 设计模式-15命令模式(Command Pattern)

    1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...

  10. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

随机推荐

  1. DataV教你如何给可视化应用一键美颜

    视频观看地址:https://yunqivedio.alicdn.com/user-upload/T4WEb4C5Fc.mp4 如果你平时经常接触数据统计.数据展示和决策分析,相信你对DataV一定有 ...

  2. Sentinel 发布里程碑版本,添加集群流控功能

    自去年10月底发布GA版本后,Sentinel在近期发布了另一个里程碑版本v1.4(最新的版本号是v1.4.1),加入了开发者关注的集群流控功能. 集群流控简介 为什么要使用集群流控呢?假设我们希望给 ...

  3. 莫烦PyTorch学习笔记(五)——模型的存取

    import torch from torch.autograd import Variable import matplotlib.pyplot as plt torch.manual_seed() ...

  4. git 命令行(四)-推送分支到远程

    在本地新建一个分支: git branch newBranch 切换到你的新分支: git checkout newBranch 创建并切换到新分支: git checkout -b newBranc ...

  5. js图片预加载实现!

    var myImage = (function(){ var imgNode = document.createElement( 'img' ); document.body.appendChild( ...

  6. Eclipse Java开发环境的搭建

    (2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2016年9月6日) 工作室的老人家们和小朋友们组成了一个Java开发学习团队,想起之前在暑假项目中学过一点Java基础知识 ...

  7. VS 断点不会命中的情况

    总结下遇到的几次断点无法命中的情况: 1.手误设置为release模式 如果是release模式的情况下,断点跳转命中情况是无法预知的,所以请修改成debug 2.与源文件不一致 这个情况是最常见的, ...

  8. nginx源码分析——数组

    ngx_array.h /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGX_ARRAY_H_INCLU ...

  9. Netty 框架基本流程

    服务端 package com.mypractice.netty.server; import java.net.InetSocketAddress; import io.netty.bootstra ...

  10. 分布式事务的2PC、3PC和TCC

    1.2PC协议 2PC 是二阶段提交(Two-phase Commit)的缩写,顾名思义,这个协议分两阶段完成.第一个阶段是准备阶段,第二个阶段是提交阶段,准备阶段和提交阶段都是由事务管理器(协调者) ...