博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(8)-命令模式详解(易懂)
阅读量:6859 次
发布时间:2019-06-26

本文共 2225 字,大约阅读时间需要 7 分钟。

命令模式的定义

命令模式,将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)。

模型:

  • Invoker:调用者,就是接收到命令后负责调用

  • Receiver:接受者,也就是执行命令的人,最苦逼的

  • Command:命令者,封装好的命令类

下面通过通俗的实例来了解一下命令模式。


实例说明

既然命令,就拿“项目经理”-“开发人员”举例吧,比如有个外包的项目需要开发,开发完成后甲方要求改一改某个功能。下面用代码详细说明一下:

**1.**首先定义一个抽象的Receiver,因为开发人员不止一个人

public abstract class AbstractReceiver {   //写项目   public abstract  void write();   //增删改项目   public abstract  void change();   //提交程序   public abstract  void ubmit();}复制代码

**2.**定义具体的Receiver,这里假设有两个开发人员

public class ReceiverA extends  AbstractReceiver{   @Override   public void write() {       Log.d("qzs","写代码");   }   @Override   public void change() {       Log.d("qzs","改需求");   }   @Override   public void submit() {       Log.d("qzs","提交");   }}复制代码
public class ReceiverB extends AbstractReceiver {   @Override   public void write() {       Log.d("qzs","写代码");   }   @Override   public void change() {       Log.d("qzs","改需求");   }   @Override   public void submit() {       Log.d("qzs","提交");   }}复制代码

**3.**定义Command,命令类,也就是刚才说的甲方要求改一改某个功能的命令,假如此功能是开发人员A改:

public abstract class AbstractCommand  {   ReceiverA receiverA=new ReceiverA();   //开发人员A   ReceiverB receiverB=new ReceiverB();   //开发人员B   //执行   public abstract  void excute();}复制代码
public class ChangeFunctionCommand extends AbstractCommand {   @Override   public void excute() {       receiverA.change();       receiverA.submit();   }}复制代码

**4.**定义Invoker类,也就是项目经理,负责安排调用

public class Invoker  {   private  AbstractCommand command;   //设置命令   public void setCommand(AbstractCommand command) {       this.command = command;   }   // 执行命令  public void Action(){      command.excute();  }复制代码

**5.**调用

//定义一个项目经理-张三       Invoker ZHANGSAN=new Invoker();       //定义修改功能的命令并执行       AbstractCommand command=new ChangeFunctionCommand();       ZHANGSAN.setCommand(command);       ZHANGSAN.Action();复制代码

运行后:


命令模式的优缺点及其他

1.优点:

  • 降低对象之间的耦合度

  • 新的命令可以很容易地加入到系统中

  • 可以比较容易地设计一个组合命令

  • 调用同一方法实现不同的功能

2.缺点:

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

3.使用场景:

  • 需要对行为进行记录,撤销,重做,事务处理时

  • 需要抽象出待执行的动作,然后以参数的形式提供出来

4.附加:

如果有人问了,撤销的操作怎么做,其实很简单。在抽象的接收类中定义一个“撤销”的方法。然后再定义一个撤销Command来增加这个撤销命令就好了。

本文学习参考了《设计模式之禅》以及网上信息...

另外可以加入我的Android技术交流群:458739310 大家可以关注我的微信公众号:「安卓干货铺」一个有质量、有态度的公众号!

转载地址:http://rjxyl.baihongyu.com/

你可能感兴趣的文章
extjs客户端与ABP框架的服务端数据交互杂记
查看>>
kali linux fuzz工具集简述
查看>>
微信小程序云开发不完全指北
查看>>
《构建之法》阅读笔记二
查看>>
20165324 前四周总结反思
查看>>
11.11评价
查看>>
第一章--第一节:环境搭建
查看>>
hdu 2665 划分树
查看>>
hdu 4251 划分树
查看>>
poj 1704 Georgia and Bob(阶梯博弈)
查看>>
JQuery中的$.ajax()
查看>>
js 幻灯片
查看>>
Keras序列模型学习
查看>>
[bzoj2809] 派遣
查看>>
Flask 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法
查看>>
PHP输出缓冲
查看>>
Windows2003上使用IIS7 Express使用FastCgi运行php
查看>>
安装程序时 “向数据库写入数据时发生错误!”
查看>>
图文:高春辉和他的网站梦
查看>>
网页之间的参数传递
查看>>