`
zhangweieye
  • 浏览: 9783 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式学习笔记(一:命令模式)

 
阅读更多

1.1概述

    在许多设计中,经常涉及到一个对象请求另一个对象调用其方法达到某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。

    例如,在军队作战中,指挥官请求三连偷袭敌人,但是指挥官不希望或无法直接与三连取得联系,那么可以将该请求:“三连偷袭敌人”形成一个“作战命令”,该作战命名的核心就是“三连偷袭敌人”。只要能让该“作战命令”被执行,就会实现偷袭敌人的目的。

    命令模式的核心就是使用命令对象来封装方法调用,即将请求者的请求:“接收者调用方法”封装到命令对象的一个方法中,这样一来,当一个对象请求另一个对象调用方法来完成某项任务时,只需和命令对象打交道,即让命令对象调用封装了“请求”的那个方法即可。具体如下图1所示:

 

图1  用命令对象封装方法调用

 

1.2模式的结构

命令模式的结构中包括四种角色:

(1)接收者(Receiver):接收者是一个类的实例,该实例负责执行与请求者相关的操作。

(2)命令接口(Command):命令是一个接口,规定了用来封装“请求”的若干个方法,比如,execute()、undo()等方法。

(3)具体命令(ConcreteCommand):具体命令是实现命令接口的类的实例。具体命令必须实现命令接口中的方法,比如execute()方法,是该方法封装一个“请求”。

(4)请求者(Invoker):请求者是一个包含Command接口变量的类的实例。请求者中的Command接口的变量可以存放任何具体命令的引用。请求者负责调用具体命令,让具体命令执行那些封装了“请求”的方法,比如execute()方法。

    命令模式结构的类图具体如下图2所示:

 

图2  命令模式结构的类图

 

1.3命令模式的优点

(1)在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。

(2)命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接收者,不必修改调用者的代码,调用者就可以直接使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接收者,新增加的调用者就可以使用已有的具体命令。

(3)由于请求者的请求被封装到了具体命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,命令模式可以记录日志。

(4)使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按照一定顺序执行这些具体命令。

 

1.4适合使用命令模式的情景

(1)程序需要在不同的时刻指定、排列和执行请求。

(2)程序需要提供撤销操作。

(3)程序需要支持宏操作(宏命令是一个具体命令,不过它包含了其他具体命令的引用。即执行一个宏命令,相当于执行了许多具体命令)

 

 

1.5命令模式的使用

     下面通过一个简单的实例,实现1.1概述中简单例子:在军队作战中,指挥官请求三连偷袭敌人。具体如下:

     首先看一下本实例构建框架具体类和1.2模式的结构中类图的对应关系,如下图3所示:

 

图3  具体应用类图对应关系

     (1)接收者(Receiver)对应的CompanyArmy类代码如下:

复制代码
package com.liuzhen.one_command;

public class CompanyArmy {
    //接受者执行如何偷袭敌人
    public void sneakAttack(){
        System.out.println("我们知道如何偷袭敌人,保证完成任务!!!");
    }
}
复制代码

    (2)命令接口(Command)对应的Command接口代码如下:

复制代码
package com.liuzhen.one_command;

public interface Command {

    public abstract void execute();
}
复制代码

    (3)具体命令(ConcreteCommand)对应的ConcreteCommand类对应的代码如下:

复制代码
package com.liuzhen.one_command;

public class ConcreteCommand implements Command {

    CompanyArmy army;   //创建接受者引用
    
    ConcreteCommand(CompanyArmy army){
        this.army = army;
    }
    //封装指挥官的请求
    public void execute(){
        army.sneakAttack();       //偷袭敌人
    }
}
复制代码

    (4)请求者(Invoker)对应的ArmySuperior类代码如下:

复制代码
package com.liuzhen.one_command;

public class ArmySuperior {

    Command command;        //创建命令的引用
    //用来存放具体命令的引用
    public void setCommand(Command command){
        this.command = command;
    }
    //让具体命令执行execute()方法,偷袭敌人
    public void startExecuteCommand(){
        command.execute();
    }
}
复制代码

    (5)具体调用命令实现,指挥官请求三连偷袭敌人的类OneApplication类代码如下:

复制代码
package com.liuzhen.one_command;

public class OneApplication {

    /**
     * @param args
     */
    public static void main(String[] args) {
        CompanyArmy 三连 = new CompanyArmy();     //创建接受者:三连
        Command command = new ConcreteCommand(三连);  //创建具体命令,并指定接受者为三连
        ArmySuperior 指挥官 = new ArmySuperior();  //创建请求者:指挥官
        指挥官.setCommand(command);   //指挥者请求命令:三连偷袭敌人
        指挥官.startExecuteCommand();  //指挥官确定执行命令:三连偷袭敌人

    }

}
复制代码

运行结果如下图4:

 

图4  运行结果

 

  • 大小: 307.2 KB
分享到:
评论

相关推荐

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    23种设计模式学习笔记

    这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    设计模式学习笔记-命令模式

    命令模式是一种行为设计模式,它的主要目的是将请求封装为对象,以便于参数化不同请求、队列请求、记录请求日志以及支持撤销和重做操作。在软件开发中,它帮助解耦了请求发起者(调用者)和请求执行者(接收者),...

    设计模式学习笔记及其模式特点总结

    设计模式是软件工程中的一种重要思想,它是在特定情境下解决问题的经验总结,是解决常见问题的最佳实践。在Java等面向对象编程语言中,设计模式的应用能够提高代码的可读性、可维护性和复用性。以下是对标题和描述中...

    设计模式学习笔记

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的经验总结。Java中的23种设计模式被广泛接受并应用于各种项目中,它们分为三类:创建型、结构型和行为型模式。 创建型模式关注对象的创建过程...

    C#设计模式学习笔记

    C#设计模式学习笔记是一份详尽的资源,适合任何希望深入了解如何在C#编程中应用设计模式的开发者。这份笔记涵盖了多种设计模式,旨在提升代码的可读性、可维护性和可扩展性,这些都是软件开发中至关重要的要素。 ...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    java设计模式学习笔记,以及各种模式的代码实现

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。这些模式是面向对象编程中的一种最佳实践,通过标准化的方式处理常见的设计问题。下面...

    尚硅谷设计模式源码笔记课件.zip

    行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...

    300Java设计模式部分学习笔记

    以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...

    根据《JAVA与设计模式》整理的笔记及示例代码

    2. 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求,或者支持可撤销的操作。 3. 解释器模式:给定一个语言,定义它的文法表示,并提供一个解释器。 4. 迭代器模式:提供一种方法顺序访问聚合对象的...

    设计模式笔记

    - 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求,或者支持可撤销的操作。 - 解释器模式:定义一个语言的文法,并提供一个解释器来处理这种语言的实例。 - 迭代器模式:提供一种方法顺序访问...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    图解设计模式 ,结城浩著 学习笔记

    根据给定的信息“图解设计模式,结城浩著学习笔记”,我们可以推断出这份文档主要涉及了设计模式的学习和理解。《图解设计模式》是一本由日本著名程序员结城浩撰写的书籍,该书以图形化的方式深入浅出地讲解了软件...

    #资源大人分享计划# 设计模式学习笔记.rar

    在这个“#资源大人分享计划# 设计模式学习笔记.rar”压缩包中,我们可以期待找到一系列关于设计模式的详细学习资料,包括定义、类图、代码示例以及各种使用场景,这些都将帮助我们深入理解并掌握设计模式。...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    《设计模式:可复用面向对象软件的基础》一书介绍了23种经典的设计模式,这些模式大致可以分为三大类: 1. **创建型模式**:专注于对象的创建机制,确保系统在合适的时机创建正确的对象。 - **单例模式**...

Global site tag (gtag.js) - Google Analytics