【设计模式】—— 命令模式Commond

  模式意图

  将一个请求封装成一个对象,从而对这个命令执行撤销、重做等操作。

  典型的Eclipse开发中,编辑器的操作就需要用到这个模式,比如Undo、Redo等等。

  另外这个模式使得一个命令的触发与接收解耦,这样我们就可以演变成把感兴趣的对象接收这个命令,当命令触发时,这些对象就会执行操作。这个机制也是java事件的处理方式。

  应用场景

  1 命令抽象成对象

  2 在不同的时刻,指定或者排队命令

  3 支持 Undo或者Redo等操作

  4 修改日志,当系统崩溃时,利用修改日志执行撤销

  5 原语操作上构造一个高层系统(不理解)

  模式结构

  Invoker 命令的触发者,触发一个命令的执行。

/**
 * 命令的触发者,发送命令
 * @author xingoo
 *
 */
class Invoker{
    private Commond commond;

    public Invoker(Commond commond) {
        this.commond = commond;
    }

    public void action(){
        commond.excute();
    }
}

  Receiver 命令的接受者,针对命令,执行一定的操作。

/**
 * 命令的接受者,负责接收命令,进行处理
 * @author xingoo
 *
 */
class Receiver{

    public Receiver() {

    }

    public void action(){
        System.out.println("Action of receiver!");
    }
}

  Commond 命令的抽象接口

/**
 * 命令接口,定义命令的统一接口
 * @author xingoo
 *
 */
interface Commond{
    public void excute();
}

  ConcreteCommond 具体的命令,关联一个接收者对象,当命令执行时,执行这个接收者对应的操作。

/**
 * 具体的命令
 * @author xingoo
 *
 */
class ConcreteCommond implements Commond{

    private Receiver receiver;

    public ConcreteCommond(Receiver receiver) {
        this.receiver = receiver;
    }

    public void excute() {
        receiver.action();
    }

}

  全部代码

 1 package com.xingoo.Commond;
 2 /**
 3  * 命令的触发者,发送命令
 4  * @author xingoo
 5  *
 6  */
 7 class Invoker{
 8     private Commond commond;
 9
10     public Invoker(Commond commond) {
11         this.commond = commond;
12     }
13
14     public void action(){
15         commond.excute();
16     }
17 }
18 /**
19  * 命令的接受者,负责接收命令,进行处理
20  * @author xingoo
21  *
22  */
23 class Receiver{
24
25     public Receiver() {
26
27     }
28
29     public void action(){
30         System.out.println("Action of receiver!");
31     }
32 }
33 /**
34  * 命令接口,定义命令的统一接口
35  * @author xingoo
36  *
37  */
38 interface Commond{
39     public void excute();
40 }
41 /**
42  * 具体的命令
43  * @author xingoo
44  *
45  */
46 class ConcreteCommond implements Commond{
47
48     private Receiver receiver;
49
50     public ConcreteCommond(Receiver receiver) {
51         this.receiver = receiver;
52     }
53
54     public void excute() {
55         receiver.action();
56     }
57
58 }
59 /**
60  * 客户端调用者
61  * @author xingoo
62  *
63  */
64 public class Client {
65     public static void main(String[] args) {
66         Receiver receiver = new Receiver();
67         Commond commond = new ConcreteCommond(receiver);
68         System.out.println("Commond register in here!");
69
70         try {
71             Thread.sleep(3000);
72         } catch (InterruptedException e) {
73             // TODO Auto-generated catch block
74             e.printStackTrace();
75         }
76
77         System.out.println("Commond excute in here!");
78         Invoker invoker = new Invoker(commond);
79         invoker.action();
80     }
81 }

  运行结果

Commond register in here!
Commond excute in here!
Action of receiver!

 

本文转自博客园xingoo的博客,原文链接:【设计模式】—— 命令模式Commond,如需转载请自行联系原博主。

时间: 2024-10-27 09:41:03

【设计模式】—— 命令模式Commond的相关文章

解读设计模式----命令模式(Command Pattern)

本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文.*** 原文连接http://www.dofactory.com/Patterns/PatternCommand.aspx 命令模式意图: GOF 在<设计模式>一书中阐述其意图:"将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作."这里所谓的"不同的请求"也既意味着请求可能发生的变化,是一个可能扩展的功能点. 命令

[Head First设计模式]餐馆中的设计模式——命令模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

经典设计模式——命令模式

    考虑这样一种场景,某个方法需要完成某一个功能,完成这个功能的大部分步骤已经确定了,但可能有少量具体步骤无法确定,必须等到该方法执行时才可以确定.具体一点:假设有个方法需要遍历某个数组的数组元素,但无法确定在遍历数组元素时如何处理这些元素,需要调用该方法时指定具体的处理行为.这个要求看起来有点奇怪:这个方法不仅要求传入参数可以变化,甚至要求方法执行体的代码也可以变化,难道我们能把"处理行为"作为一个参数传入该方法?     很遗憾,Java语言暂时还不支持将代码块作为参数传递给方

PHP设计模式——命令模式

声明:本系列博客参考资料<大话设计模式>,作者程杰.             命令模式:在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,实现二者之间的松耦合.这就是命令模式.  

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

命令模式(Command Pattern) --.NET设计模式系列之十七 TerryLee,2006年7月 概述 在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李

iOS设计模式 - 命令模式

前言: 命令对象封装了如何对目标执行指令的信息,因此客户端或调用者不必了解目标的任何细节,却仍可以对他执行任何已有的操作.通过把请求封装成对象,客 户端可 以把它参数化并置入队列或日志中,也能够支持可撤销操作.命令对象将一个或多个动作绑定到特定的接收器.命令模式消除了作为对象的动作和执行它的接收器之 间的绑定. 正文内容大纲: 1.电视机.遥控器与接收器之间的关系 2.改变一个视图的明暗程度(未使用命令模式) 3.命令模式介绍 4.改变一个视图的明暗程度(使用命令模式) 5.附录 1.电视机.遥

14、Python与设计模式--命令模式

一.饭店点餐系统 又是一个点餐系统(原谅作者的吃货属性).不过这次的点餐系统是个饭店的点餐系统.饭店的点餐系统有什么不同嘛?大伙想想看,在大多数饭店中,当服务员已经接到顾客的点单,录入到系统中后,根据不同的菜品,会有不同的后台反应.比如,饭店有凉菜间.热菜间.主食间,那当服务员将菜品录入到系统中后,凉菜间会打印出顾客所点的凉菜条目,热菜间会打印出顾客所点的热菜条目,主食间会打印出主食条目.那这个系统的后台模式该如何设计?当然,直接在场景代码中加if-else-语句判断是个方法,可这样做又一次加重

Java设计模式--命令模式

命令模式(别名:动作,事物) 为系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. Command Pattern(Another name:Action,Transaction) Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and s

设计模式之禅之设计模式-命令模式

一:命令模式的定义        --->命令模式是一个高内聚的模式        --->将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能.        --->命令模式的角色                ● Receive接收者角色==>该角色就是干活的角色,命令传递到这里是应该被执行的                ● Command命令角色==>需要执行的所有命令都在这里声明