学习笔记

Android源码设计模式_7命令模式
Publish: 2018/8/22   

定义

将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

使用场景

  1. 需要抽象出待执行的动作,然后以参数的形式提供出来——类似于过程设计中的回调机制,而命令模式正是回调机制的一个面向对象的替代品。
  2. 在不同的时刻指定、排列和执行请求。一个命令对象可以有于初始请求无关的生存期。
  3. 需要支持取消操作。
  4. 支持修改日志功能,这样当系统崩溃时,这些修改可以被重做一遍。
  5. 需要支持事务操作。

实现示例


 public class Receiver{
     /**
      * 真正执行具体命令逻辑的方法
      */
     public void action(){
         System.out.println("执行具体操作");
     }
 }

 public interface Command{
     /**
      * 执行具体操作的命令
      */
     void execute();
 }

 public class ConcreteCommand implements Command{
     private Receiver receiver;//持有一个对接收者对象的引用

     public ConcreteCommand(Receiver receiver){
         this.receiver = receiver;
     }

     @Override
     public void execute(){
        //调用接收者的相关方法来执行具体逻辑
        receiver.action();
     }
 }

 public class Invoker{
     private Command command;//持有一个对相应命令对象的引用

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

     public void action(){
         //调用具体命令对象的相关方法,执行具体命令
         command.execute();
     }
 }

 public class Client{
     public static void main(String[] args){
         //构造一个接收者对象
         Receiver receiver = new Receiver;

         // 根据接收者对象构造一个命令对象
         Command command = new ConcreteCommand(receiver);

         //根据具体的对象构造请求者对象
         Invoker invoker = new Invoker(command);

         //执行请求方法
         invoker.action(); 
      }
 }

缺点

类的膨胀,大量衍生类的创建。

优点

更弱的耦合性、更灵活的控制性以及更好的扩展性。



← Android源码设计模式_8观察者模式 Android源码设计模式_6责任链模式 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel