`

《设计模式》之十:命令模式

阅读更多

Command pattern 命令模式定义:

Encapsulate a request as an object, thereby letting you parameterize cients with different requests, queue or log requests, and support undoable operations.

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

 

命令模式的通用模板:

具体执行方Receiver

public abstract class Receiver {
    // 抽象接受者,定义每个接受者都必须完成的业务
    public abstract void doSomething();
}

Receiver 两个实现类:

public class ConcreteReceiver1 extends Receiver {
    @Override
    public void doSomething() {

    }
}

 

public class ConcreteReceiver2 extends Receiver {
    @Override
    public void doSomething() {

    }
}

 然后是命令抽象类Command

public abstract class Command {
    // 定义一个子类的全局共享变量
    protected final Receiver receiver;
    // 实现类必须定义一个接受者
    public Command(Receiver _receiver) {
        this.receiver = _receiver;
    }
    // 每个命令都必须有一个执行命令的方法
    public abstract void execute();
    // 支持撤销请求
    public abstract void rollback();
}

 两个命令实现类:

public class ConcreteCommand1 extends Command {
    // 声明自己的默认的接受者
    public ConcreteCommand1() {
        super(new ConcreteReceiver1());
    }

    // 设置新的接受者
    public ConcreteCommand1(Receiver _receiver) {
        super(_receiver);
    }

    @Override
    public void execute() {
        super.receiver.doSomething();
    }
    @Override
    public void rollback() {
        System.out.println("根据命令日志撤销");
    }
}

 

public class ConcreteCommand12 extends Command {
    // 声明自己的默认的接受者
    public ConcreteCommand12() {
        super(new ConcreteReceiver1());
    }

    // 设置新的接受者
    public ConcreteCommand12(Receiver _receiver) {
        super(_receiver);
    }

    @Override
    public void execute() {
        super.receiver.doSomething();
    }
    @Override
    public void rollback() {
        System.out.println("根据命令日志撤销");
    }
}

 最后是请求方Invoker类,跟客户端打交道的唯一的类:

public class Invoker {
    private Command command;

    // 受气包,所有命令都得接受
    public void setCommand(Command _command) {
        this.command = _command;
    }
    // 执行命令
    public void action() {
        this.command.execute();
    }
}

 客户端调用演示:

public class Client {
    public static void main(String[] args) {
        // 首先声明调用者Invoker
        Invoker invoker = new Invoker();
        // 定义一个发送给接受者的命令
        Command command = new ConcreteCommand1();
        // 把命令交给调用者去执行
        invoker.setCommand(command);
        invoker.action();
    }
}

 

命令模式优点:

1,类间解耦

调用者角色和接受者角色之间没有任何依赖关系,调用者实现功能时只需要调用Command抽象类的execute方法就可以了,不需要了解到底哪个接受者执行。

2,可扩展性

Command子类可以非常容易的扩展,而调用者Invoker和高层次模块Client不产生严重的代码耦合

3,命令模式结合其他模式更优秀

命令模式可以结合责任链模式,实现命令族解析任务;

结合模板方法模式,则可以减少Command子类膨胀问题

 

命令模式缺点:

如果有N个命令,那么Command子类就必须有N个

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

 

分享到:
评论

相关推荐

    设计模式之命令模式

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象和执行命令的...

    设计模式之命令模式案例代码

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在本文中,我们将深入探讨命令模式的原理、结构和实际应用,并...

    设计模式之命令模式源码示例

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式广泛应用在各种场景中,以提高代码的灵活...

    【Java 设计模式-源码】命令模式:增强灵活的命令执行

    在 Java 中,命令模式是一种行为设计模式,它将请求封装为对象,允许对客户端进行参数化,包括队列、请求和操作。该模式还支持可撤销的操作,增强了管理和执行命令的灵活性。 二、命令设计模式的别名 Action(动作)...

    《设计模式:可复用面向对象软件的基础》英文版

    《设计模式:可复用面向对象软件的基础》是一本由Erich Gamma、Richard Helm等四位国际知名的软件工程师共同编写的经典之作,该书提供了面向对象软件设计中常用的模式,并通过具体的案例解释了这些模式如何帮助解决...

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

    **设计模式之Command(命令)模式** Command模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,同时支持可撤销的操作。这种模式在软件工程中广泛应用于解耦请求的发送者...

    php设计模式案例详解

    11. **命令设计模式**:将请求封装为一个对象,以便使用不同的请求、队列请求,或者支持可撤销的操作。 12. **组合设计模式**:允许我们把一组对象组合成树形结构来表现“整体-部分”关系,使得“客户程序”可以...

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

    命令模式是一种行为设计模式,它的主要目的是将请求者与接收者解耦,使得请求的发起者无需知道哪个对象会执行这个请求,同时也让系统更容易扩展。这种模式在软件工程中广泛应用,特别是在事件驱动和分布式系统中。 ...

    设计模式-命令模式

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在iOS开发中,命令模式尤其适用于处理事件驱动的编程场景,因为...

    设计模式C++学习之命令模式(Command)

    命令模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中,命令模式的应用可以帮助我们更好地组织代码,提高代码的可扩展性和可维护性。...

    C#设计模式(设计模式的思想:对通用的对象间的相互作用方式进行记录和编目)

    以上只是C#设计模式中的一部分,实际上还有许多其他模式,如命令模式、模板方法模式、迭代器模式等。学习和掌握这些模式,开发者可以更好地设计出可扩展、可维护的系统,提高代码质量。在C#中,由于语言特性的支持,...

    java之23种设计模式完整代码

    这里我们探讨的“Java之23种设计模式完整代码”是一份宝贵的资源,它包含了所有23种经典设计模式的实现示例。这份资料能够帮助开发者深入理解每种设计模式的概念、应用场景以及它们之间的差异。 设计模式是经过时间...

    23种设计模式详解PDF

    设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): ...策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    Head First 设计模式 (六) 命令模式(Command pattern) C++实现

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在Head First 设计模式这本书中,第六章详细介绍了如何在C++中...

    命令设计模式示例

    在压缩包`commandPro`中,可能包含了一系列关于命令设计模式的实例代码,你可以通过查看这些代码更深入地理解命令模式的实现和应用。这些代码可能包括不同类型的命令,例如批处理命令、可撤销命令等,以及如何在实际...

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

    《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》是一本深入探讨软件设计模式的书籍,它涵盖了创建型、结构型和行为型三种主要类型的23个经典设计模式,并提供了C++语言的实现代码。设计模式是软件工程中的...

Global site tag (gtag.js) - Google Analytics