首页 > 其他 > 详细

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

时间:2016-08-06 20:37:18      阅读:275      评论:0      收藏:0      [点我收藏+]

模式的定义

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

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

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

原文:http://blog.csdn.net/hfreeman2008/article/details/52134841

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!