`
flysnail
  • 浏览: 92866 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

对设计模式—Command模式的认识

阅读更多
今天抽空看了一下Command 模式,Command 模式涉及了五个角色它们分别是:
客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。
命令(Command)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色。
具体命令(ConcreteCommand)角色:定义一个接受者和行为之间的弱耦合;实现Execute()方法,负责调用接收考的相应操作。Execute()方法通常叫做执方法。
请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

就象我们做软件开发一样,项目来了,项目经理发出"开始项目开发"命令给开发人员,这个命令E-mail 传达,开发人员接收到命令后开始开发软件.
public interface ICommand
{
    public void execute();
}
public class DesginCommand implements ICommand
{
    private IReceiver receiver;


    public DesginCommand(IReceiver receiver)
    {
        this.receiver = receiver;
    }

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

}
public interface IReceiver
{
    public void action();

}
public class SoftEngineer implements IReceiver
{
    public void action()
    {
        System.out.println("Begin to desgin software");
    }
}
public class Invoker
{
    private ICommand command;


    public Invoker(ICommand command)
    {
        this.command = command;
    }

    public void executeCommand()
    {
        command.execute();
    }

}
public class ClientTestCommand
{
    public static void main(String[] args)
    {
        Invoker invoker = new Invoker(new DesginCommand(new SoftEngineer()));
        invoker.executeCommand();
    }

}



A.在什么情况下应当使用命令模式
在下面的情况下应当考虑使用命令模式:
1、使用命令模式作为"CallBack"在面向对象系统中的替代。"CallBack"讲的便是先将一个函数登记上,然后在以后调用此函数。
2、需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在串形化之后传送到另外一台机器上去。
3、系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令效果。
4、如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。
5、一个系统需要支持交易(Transaction)。一个交易结构封装了一组数据更新命令。使用命令模式来实现交易结构可以使系统增加新的交易类型。

B.使用命令模式的优点和缺点
命令允许请求的一方和接收请求的一方能够独立演化,从而且有以下的优点:
命令模式使新的命令很容易地被加入到系统里。
允许接收请求的一方决定是否要否决(Veto)请求。
能较容易地设计-个命令队列。
可以容易地实现对请求的Undo和Redo。
在需要的情况下,可以较容易地将命令记入日志。
命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。
命令类与其他任何别的类一样,可以修改和推广。
你可以把命令对象聚合在一起,合成为合成命令。比如宏命令便是合成命令的例子。合成命令是合成模式的应用。
由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
命令模式的缺点如下:
使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。
5
0
分享到:
评论

相关推荐

    设计模式大全,带你全面认识设计模式

    "设计模式大全,带你全面认识设计模式"这个资源很可能是为了帮助初学者和有经验的开发者深入理解并掌握设计模式的精髓。 设计模式通常分为三大类:创建型、结构型和行为型模式。创建型模式主要关注对象的创建过程,...

    二十三种设计模式【PDF版】

    1.设计模式更抽象,J2EE 是具体的产品代码,我们可以接触到,而设计模式在对每个应用时才会产生具体代码。 2.设计模式是比 J2EE 等框架软件更小的体系结构,J2EE 中许多具体程序都是应用设计模式来完成的,当你深入...

    C++设计模式精解

    从提供的文件信息中我们可以提取到的IT知识点主要集中在C++设计模式方面。具体的知识点可以分解为以下几点: ...同时,也能对学习设计模式的过程有一个更全面的认识,从而更好地掌握这些设计思想。

    C#23种设计模式_示例源代码及PDF

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案, 装饰模式 提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由 一些基本功能的排列组合而产生...

    深入浅出设计模式样章

    《深入浅出设计模式样章》是一本专为软件开发者准备的指南,旨在帮助读者理解和掌握设计模式这一核心编程概念...样章虽然只是全书的一部分,但已经足够让读者对设计模式有初步的认识,并激发他们进一步深入研究的兴趣。

    23种设计模式(C++).pdf

    而在讨论设计模式时,双分派的概念可以进一步提升对Visitor模式的认识。设计模式的重要性不言而喻,它们是软件设计中不可或缺的工具,能够使开发者更加高效地进行面向对象的分析和设计。 在本书的附录部分,作者...

    GoF+23种设计模式解析附C++实现源码.pdf

    通过对GoF的23种设计模式的学习和理解,我们可以深刻认识到这些模式对于提高软件质量和效率的重要性。每个模式都针对特定的问题提出了有效的解决方案,帮助我们更好地设计和构建高质量的软件系统。同时,通过实际的...

    Head.First设计模式_PDF.part1

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Templat Method、Iterator、Composite、State、Proxy。最后三章比较...

    Java常用的设计模式

    ### Java常用的设计模式详解 #### 一、工厂模式(Factory) **工厂模式**是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建一个工厂类来负责创建产品类的对象。当系统需要创建...

    JAVA单元测试JUnit

    JUnit的成功部分归功于其巧妙运用设计模式,特别是Command模式,它不仅简化了测试用例的开发,也增强了框架本身的灵活性和可维护性。通过将测试用例视为命令对象,JUnit实现了测试执行的封装和隔离,降低了系统各...

    Pro-Objective-C-Design-Patterns-for-iOS

    本书中提到的“设计模式”不仅仅存在于代码中,更需要开发者去认识、理解和充分利用它们。 这本书覆盖了多种经典的设计模式,如单例模式(Singleton)、抽象工厂模式(Abstract Factory)、责任链模式(Chain of ...

    MyBatis学习总结

    类型 设计模式主要分为三类:创建型模式、结构型模式和行为型模式。 1. 创建型模式(Creational Patterns):如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式...

    2014版传智播客笔试面试宝典

    在.NET面试中,开发者需要掌握的关键知识点涵盖了C#语言基础、面向对象编程、.NET框架核心、数据库交互、Web开发、多线程、设计模式等多个方面。 1. **C#语言基础**:C#是.NET平台的核心编程语言,了解其语法特性至...

    .net 连连看的简单实现

    《.NET 连连看游戏的简易实现》 在编程领域,实现一款经典的小游戏是提升技能和理解软件工程的良好途径。...通过这个项目,开发者可以在实践中深化对面向对象编程、算法运用和软件设计原则的认识。

    struts2源码

    在Struts2中,Action和Command的设计模式相结合,使得业务处理更加灵活。Action作为Web层的入口,负责接收HTTP请求,而Command对象则执行实际的业务逻辑。Validator则提供了数据验证功能,可以对用户输入进行校验,...

Global site tag (gtag.js) - Google Analytics