设计模式之命令模式---Command Pattern

模式的定义

命令模式是一个高内聚的模式,定义如下:

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

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

模式的使用场景

只要是你认为是命令的地方,就可以采用命令模式

UML类图

角色介绍

  • Receiver接收者角色

命令接收者模式,命令传递到这里执行对应的操作。

  • Command命令角色

    需要执行的命令都在这里声明

  • Invoker调用者角色

    接收到命令,并执行命令,也就是命令的发动者和调用者

命令模式封装性比较好,比较简单,项目中使用比较频繁。它把命令请求方(Invoker)和执行方(Receiver)分开,扩展性好。

模式的通用源码

通用Receiver类:

public abstract class Receiver {

    public abstract void doSomething();
}

具体Receiver类:

public class ConcreteReceiver1 extends Receiver{

    @Override
    public void doSomething() {
        // TODO Auto-generated method stub
        System.out.println("ConcreteReceiver1---doSomething");
    }

}

public class ConcreteReceiver2 extends Receiver{

    @Override
    public void doSomething() {
        // TODO Auto-generated method stub
        System.out.println("ConcreteReceiver2---doSomething");
    }

}

抽象Command类:

public abstract class Command {

    public abstract void execute();
}

具体Command类:

public class ConcreteCommand1 extends Command {

    private Receiver receiver;

    public ConcreteCommand1(Receiver receiver) {
        super();
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        // TODO Auto-generated method stub
        System.out.println("ConcreteCommand1---execute");
        receiver.doSomething();
    }

}

public class ConcreteCommand2 extends Command {

    private Receiver receiver;

    public ConcreteCommand2(Receiver receiver) {
        super();
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        // TODO Auto-generated method stub
        System.out.println("ConcreteCommand2---execute");
        receiver.doSomething();
    }

}

调用者Invoker类:

public class Invoker {

    private Command command;

    public void setCommand(Command command){
        this.command = command;
    }

    public void action(){
        this.command.execute();
    }
}

场景Client类:


public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Receiver receiver1 = new ConcreteReceiver1();
        Command command1 = new ConcreteCommand1(receiver1);

        Invoker invoker = new Invoker();
        invoker.setCommand(command1);
        invoker.action();

        Receiver receiver2 = new ConcreteReceiver2();
        Command command2 = new ConcreteCommand2(receiver2);

        invoker.setCommand(command2);
        invoker.action();
    }

}

输出结果:

ConcreteCommand1---execute
ConcreteReceiver1---doSomething

ConcreteCommand2---execute
ConcreteReceiver2---doSomething

优点

  • 类间解藕

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

  • 可扩展性

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

  • 命令模式结合其他模式会更优秀

命令模式与责任链模式,实现命令族解析任务。结合模板方法模式,则可以减少Command子类的膨胀问题

缺点

命令模式的缺点就是类膨胀,如果有N多子命令,那是不是Command子类就有N多。

Android源码中的模式实现

UML类图

具体实现代码

参考资料

(1).设计模式之禅—第15章 命令模式

(2)命令模式

https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/command/lijunhuayc

时间: 2024-10-06 19:48:52

设计模式之命令模式---Command Pattern的相关文章

设计模式 - 命令模式(command pattern) 具体解释

命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对象, 以便使用不同的请求\队列\日志来參数化其它对象. 命令模式也能够支持撤销操作. 简单的命令模式的实现: 1. 详细的类, 每个类都有特定的方法: /** * @time 2014年6月9日 */ package command; /** * @author C.L.Wang * */ publ

设计模式 - 命令模式(command pattern) 详解

命令模式(command pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 命令模式: 将请求封装成对象, 以便使用不同的请求\队列\日志来参数化其他对象. 命令模式也支持可撤销操作. 命令模式: 调用者(Invoker); 命令(Command): 可执行方法(execute), 具体命令(Concrete Command); 接受者(Receiver): 调用命令(Set Command); 具体方法: 1. 具体对象. /** *

设计模式 - 命令模式(command pattern) 多命令 详解

命令模式(command pattern) 多命令 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 具体步骤: 1. 多命令, 把未使用的命令, 初始化为空对象(NoCommand), 根据参数(slot), 选择输出命令. /** * @time 2014年6月16日 */ package command; /**

设计模式 - 命令模式(command pattern) 撤销(undo) 详解

命令模式(command pattern) 撤销(undo) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式可以用于执行撤销(undo)操作. 具体方法: 1. 对象类中需要保存状态, 如level. package command; public class CeilingFan { String loca

设计模式 - 命令模式(command pattern) 宏命令(macro command) 详解

命令模式(command pattern) 宏命令(macro command) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考: 命名模式(撤销): http://blog.csdn.net/caroline_wendy/article/details/31419101 命令模式可以执行宏命令(macro command), 即多个命令的组合操作. 具体方法:  1. 其余代码与命令(撤销)一致 2. 添加宏命令(macro command),

设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式能够用于运行撤销(undo)操作. 详细方法: 1. 对象类中须要保存状态, 如level. package command; public class CeilingFan { String lo

设计模式 - 命令模式(command pattern) 多命令 具体解释

命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 具体步骤: 1. 多命令, 把未使用的命令, 初始化为空对象(NoCommand), 依据參数(slot), 选择输出命令. /** * @time 2014年6月16日 */ package command; /*

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

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

设计模式----行为型模式之命令模式(Command Pattern)

下面来自head first设计模式的命令模式一章节. 定义 将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图 注: 1.Client:该类主要创建concreteCommand类,并设置其接收者Recevier; 2.Receiver:该类为接收者类,该类主要是负责接收命令,和执行命令; 3.Command:该类为 所有命令的抽象类或或接口,该类具备抽象方法execute/undo方法; 4.Invoker:该类为调用者,该调