设计模式之命令者

如老板命令你完成一个OA项目是一个命令,接着看看其特点:

1、在上面的命令中,命令的执行者肯定是聪明的你了。具体的执行方法,可能是通过vs实现,或者是通过eclipse实现,由此看来:命令要有个命令的执行者,还要有个命令的执行方法。

2、命令的发出者很明显是老板,老板还有个发出方法,可能是通过电话给你说,也可能给你邮件给你说,也可能是通过开会给你说。所以命令的发出者要有一个命令,还要有个发出的方法。

3、最后看看命令,命令有个名字,命令的肯定要执行。而且命令是在boss给你发出通知后执行的。

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

它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题

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 2The television is off.

参考:http://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.htmlhttp://www.cnblogs.com/lzhp/p/3395320.htmlhttp://haolloyin.blog.51cto.com/1177454/339076/http://blog.csdn.net/jason0539/article/details/45110355http://www.cnblogs.com/ikuman/archive/2013/08/06/3233092.html
时间: 2024-08-30 01:35:30

设计模式之命令者的相关文章

理解设计模式(命令者)

当请求者无法或不能与接收者直接交流时,使用命令者模式. 特定环境下一类问题 以下情况适用命令者模式:程序中, 需要排队完成某些逻辑 支持撤销操作 支持宏操作 解决方案 4个角色如下: 请求者—封装抽象命令引用,发起请求,即命令执行 抽象命令—规范命令执行 具体命令—命令执行逻辑,封装接收者引用 接收者—只负责完成自身逻辑,不含任何引用 请求者作为发起者,发出请求,执行命令 最终,命令驱动接收者作出相应 优劣 优点: 请求者和接收者相互解耦 命令可扩展,符合 “开闭” 原则 请求被封装在具体命令内

设计模式之命令模式

命令模式的核心是把方法调用封装起来,调用的对象不需要关心是如何执行的. 定义:命令模式将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也可以支持撤销操作. 先看一个例子,设计一个家电遥控器的API,可以通过遥控器发出命令来控制不同生产商生产的家电,比如关灯.开灯. 以下是一个简单的代码示例. 1 package cn.sp.test05; 2 /** 3 * 电灯类 4 * @author 2YSP 5 * 6 */ 7 public class Lig

设计模式之命令模式20170719

行为型设计模式之命令模式: 一.含义 将请求(命令)封装成一个对象(内部有接收者对象,以及按照具体命令执行接收者操作的方法),传递给调用者,由调用者执行具体命令. 也就是把一个动作的执行分为执行对象(接收者角色).执行行为(命令角色),让两者相互独立而不相互影响,实现对动作解耦 二.代码说明 1.主要有三个角色 1)接收者角色 该角色就是干活的角色,被命令角色调用,其操作按具体命令的要求执行 2)命令角色 需要执行的所有命令都在这里声明,同时接收者所有的对象都在这里(接收者封装在这里,防止高层模

跟我学设计模式视频教程——命令模式vs策略模式,唠嗑

课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--命令模式vs策略模式,唠嗑,布布扣,bubuko.com

用Java 8 Lambda表达式实现设计模式:命令模式

链接:http://www.importnew.com/16789.html 在这篇博客里,我将说明如何在使用Java 8 Lambda表达式的函数式编程方式时实现命令设计模式.命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化,并提供相应的操作.命令模式是一种通用编程方式,该方式基于运行时决策顺序来执行方法.模式的参与者如下: 命令 :声明用于执行操作的接口. 实体命令 :定义接收者对象和动作的绑定. 客户端 :创建实体命令实例并设置它的接收者. 调用者:

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

设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题

设计模式(6)--命令模式

关键词 :空对象 有人称为设计模式 三层调用 1. 封装调用  , 把封装带到一个全新的境界: 把方法调用(method invocation) 封装起来. 2. 命令模式可将"动作的请求者" 从"动作的执行者" 对象中解耦. 3. 当需要将发出的请求和执行请求的对象解耦的时候,使用命令模式. OO原则: (1)封装变化 (2) 多用组合,少用继承 (3)针对接口编程,不针对实现编程 (4)为交互对象之间松耦合设计而努力 (5) 类应该对扩展开放,对修改关闭 (6)

设计模式 7 —— 命令模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式(迭代器) 设计模式 4 —— 迭代器和组合模式(组合) 设计模式 5 —— 工厂模式 设计模式 6 —— 单件模式 设计模式 7 —— 命令模式 概述 第1部分 问题引入 第2部分 定义和实现 第3部分 使用宏命令 第1部分 问题引入 首先看下,下面的要求: 实现命令接口 首先,让说有的命令对象实现相同的包含一个方法的接口. 1 /** 2 * 命令接口 3 * @ClassNam

C#设计模式(15)——命令模式(Command Pattern)

原文:C#设计模式(15)--命令模式(Command Pattern) 一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否“优美”.可读.但是,要更好地应用,首先就必须了解各种设计模式和其应用场景,所以我还是希望继续完

设计模式:命令(Command)模式

设计模式:命令(Command)模式 一.前言 命令也是类,将命令作为一个类来保存,当要使用的时候可以直接拿来使用,比如脚本语言写出的脚本,只需要一个命令就能执行得到我们想要的需要操作很长时间才能得到的结果.这是一个非常有意思的模式,将操作的步骤保存下来,本例之中我们使用java自带的GUI来画图,然后将画图的过程(在哪个地方画了什么东西)保存下来,可以把每一次我们的操作作为一个命令,其实就是<使用什么画布,画点的坐标>,将这个命令对应的对象保存到所有命令对象的集合之中去,这样命令集合就记录下