1.概念

  将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。

   在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。

但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作command类。

Command模式可应用于
a)整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。
b)调用前后需要对调用参数进行某些处理。
c)调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。

Command模式有如下效果:
a)将调用操作的对象和知道如何实现该操作的对象解耦。
b)Command是头等对象。他们可以像其他对象一样被操作和扩展。
c)你可将多个命令装配成一个符合命令。
d)增加新的Command很容易,因为这无需改变现有的类。

 

2.UML

3.代码

public interface Command {public void execute();
}public class ConcreteCommand implements Command {private Receiver receiver = null;private String state;public ConcreteCommand(Receiver receiver){this.receiver = receiver;}  public void execute() {receiver.action();}
}public class Receiver {public void action(){//真正执行命令操作的功能代码}
}public class Invoker {private Command command = null;public void setCommand(Command command) {this.command = command;}public void runCommand() {command.execute();}
}public class Client {public void assemble(){//创建接收者Receiver receiver = new Receiver();//创建命令对象,设定它的接收者Command command = new ConcreteCommand(receiver);//创建Invoker,把命令对象设置进去Invoker invoker = new Invoker();invoker.setCommand(command);}
}
下面给个例子,是模拟对电视机的操作有开机、关机、换台命令。代码如下//命令接收者
public class Tv {public int currentChannel = 0;public void turnOn() {System.out.println("The televisino is on.");}public void turnOff() {System.out.println("The television is off.");}public void changeChannel(int channel) {this.currentChannel = channel;System.out.println("Now TV channel is " + channel);}
}//执行命令的接口
public interface Command {void execute();
}//开机命令
public class CommandOn implements Command {private Tv myTv;public CommandOn(Tv tv) {myTv = tv;}public void execute() {myTv.turnOn();}
}//关机命令
public class CommandOff implements Command {private Tv myTv;public CommandOff(Tv tv) {myTv = tv;}public void execute() {myTv.turnOff();}
}//频道切换命令
public class CommandChange implements Command {private Tv myTv;private int channel;public CommandChange(Tv tv, int channel) {myTv = tv;this.channel = channel;}public void execute() {myTv.changeChannel(channel);}
}//可以看作是遥控器吧
public class Control {private Command onCommand, offCommand, changeChannel;public Control(Command on, Command off, Command channel) {onCommand = on;offCommand = off;changeChannel = channel;}public void turnOn() {onCommand.execute();}public void turnOff() {offCommand.execute();}public void changeChannel() {changeChannel.execute();}
}//测试类
public class Client {public static void main(String[] args) {// 命令接收者Tv myTv = new Tv();// 开机命令CommandOn on = new CommandOn(myTv);// 关机命令CommandOff off = new CommandOff(myTv);// 频道切换命令CommandChange channel = new CommandChange(myTv, 2);// 命令控制对象Control control = new Control(on, off, channel);// 开机control.turnOn();// 切换频道control.changeChannel();// 关机control.turnOff();}
}执行结果为:
The televisino is on.
Now TV channel is 2
The television is off.

4.应用场景

在下面的情况下应当考虑使用命令模式:

1)使用命令模式作为"CallBack"在面向对象系统中的替代。"CallBack"讲的便是先将一个函数登记上,然后在以后调用此函数。

2)需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在串形化之后传送到另外一台机器上去。

3)系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令效果。

4)如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。

java设计模式---命令模式相关推荐

  1. JAVA 设计模式—————— 命令模式和职责链模式

    学习 Netty 前的准备工作!! 这里,还是先来复习一下 OOP (面向对象)的七大原则: 开闭原则:对扩展开放,对修改关闭 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立. 依赖倒置原 ...

  2. JAVA设计模式--命令模式

    目录 一.什么是命令式 二.命令模式的适用性 三.命令模式的结构 四.命令模式的优点 五.认识命令模式 六.总结 一.什么是命令式 命令(Command)模式又叫作动作(Action)模式或事务(Tr ...

  3. Java设计模式-命令模式

    命令模式   在软件开发系统中,常常出现"方法的请求者"与"方法的实现者"之间存在紧密的耦合关系.这不利于软件功能的扩展与维护.例如,想对行为进行"撤 ...

  4. Java设计模式-命令模式Command

    定义 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于"行为请求者"与"行为实现者"解耦,可实现二者之间的松耦合,以便适应变化.分离 ...

  5. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  6. 设计模式 命令模式 实例_根据您的命令-命令设计模式

    设计模式 命令模式 实例 命令设计模式是一种广为人知的设计模式,属于行为设计模式("四人帮"的一部分). 顾名思义,它与应用程序中的动作和事件有关. 问题陈述: 假设有一个网页将在 ...

  7. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  8. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  9. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

最新文章

  1. python使用matplotlib可视化subplots绘制子图、自定义几行几列子图,如果M行N列,那么最终包含M*N个子图、在指定的子图中添加可视化结果
  2. linux 4.4内核特性,Linux Kernel 4.4.19 LTS长期支持版发布
  3. [Teaching] [Silverlight] 30秒快速建立遊戲迴圈 (Game Loop)
  4. Navicat-数据库管理工具
  5. python 输入中文_【提醒】Python新手开发人员注意事项:不要误输入中文标点符号...
  6. 推荐系统在房产领域的实践
  7. 编程基础(四)——cache之一
  8. BZOJ2592: [Usaco2012 Feb]Symmetry
  9. Opencv椭圆拟合
  10. Python:实现sha256算法(附完整源码)
  11. mysql6.2中文补丁_2.6. 在NetWare中安装MySQL - MySQL 中文手册
  12. Animate.css动画库的使用操作
  13. Mindjet MindManager2022版本自带简体中文,无需汉化
  14. Java SE学习笔记
  15. zblog php 源码,zblog技术导航v2.3全站源码+数据
  16. [QT]The inferior stopped because it received a signal from the operating system 自己解决方法
  17. 如何保存window10锁屏壁纸
  18. Android热修复实现一
  19. NAT(地址转换模式)
  20. Centos8、Centos7解决Ens33网卡不显示IP地址的问题。

热门文章

  1. BLOCK层基本概念:bio,request,request_queue
  2. jQuery:动态改变html表单的目标页(Target)
  3. ASP.NET:为 AJAX 请求添加客户端事件
  4. FortiGate SSH管理认证问题安全公告
  5. Spring Boot 中的容器配置
  6. NOI2012 美食节
  7. Screen OS 6.0 学习笔记一
  8. 多线程之失败自动重试机制
  9. ORM学员管理系统单表查询示例
  10. Google Palette算法详解以及OC化