命令模式 Command「建议收藏」

命令模式 Command「建议收藏」命令模式 Command动机模式定义实例结构要点总结笔记动机在软件构建过程中,“行为请求者”与”行为实现者”通常呈现一种”紧耦合”,但在某些场合—-比如需要对行为进行记录,撤销/重(Undo / Redo),事务”等处理,这种无法抵御变化的紧耦合是不合适的在这种情况下,如何将”行为请求者”和”行为实现这”解耦?将一组行为抽象为对象,可以实现两者之间的松耦合模式定义将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作实例#i

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

在软件构建过程中,“行为请求者”与”行为实现者”通常呈现一种”紧耦合”,但在某些场合—-比如需要对行为进行记录,撤销/重(Undo / Redo),事务”等处理,这种无法抵御变化的紧耦合是不合适的

在这种情况下,如何将”行为请求者”和”行为实现这”解耦?将一组行为抽象为对象,可以实现两者之间的松耦合

模式定义

将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作

实例

#include<vector>
#include<string>
using namespace std;
class Command{ 
   
public:
    virtual void execute() = 0;
}

class ConcreteCommand1 : public Command{ 
   
    string arg;
public:
    ConcreteCommand1(const string &a) : arg(a){ 
   }
    void execute()override{ 
   
        cout<<"#1 process....."<<arg<<endl;
    }
}

class ConcreteCommand2 : public Command{ 
   
    string arg;
public:
    ConcreteCommand1(const string &a) : arg(a){ 
   }
    void execute()override{ 
   
        cout<<"#1 process....."<<arg<<endl;
    }
}

结构

在这里插入图片描述

要点总结

  • COmmand模式的根本目的在于将”行为请求者”与”行为实现者”解耦,在面向对象语言中.常见的实现手段是”将行为抽象为对象”
  • 实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息.通过使用Composite模式,可以将多个”命令”封装为一个”符合命令”MacroCommand
  • Command模式与C++中的函数对象有些类似.但两者定义行为接口的规范有所区别:Command以面向对象中的”接口”来定义行为接口规范,更严格.但有性能损失:C++函数对象以函数签名来定义行为接口规范,更灵活,性能更高

笔记

  • 把行为封装成对象
  • 行为一般指的是代码
  • 代码和对象之间的绑定是紧密的 天然强耦合的
  • 一旦变成对象就有很高的灵活度 可以序列化 可以当参数等等
  • Command是行为对象
  • ConcreteCommand是对象 但是其表征的是行为
  • copy delete undo等等都可以看成一个个命令
  • 有了模板的话 函数式对象作用比较大
  • Command模式很多情况下都被函数对象代替
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168497.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最实用的高并发任务执行架构设计 | 架构篇

    最实用的高并发任务执行架构设计 | 架构篇目录前言高并发任务执行架构需求场景业务架构设计技术架构设计初始设计演化阶段一演化阶段二演化阶段三代码设计总结前言随着互联网与软件的发展,除了程序员,架构师也是越来越火的职业。他们伴随着项目的整个生命过程,他们更像是传统工业的设计师,将项目当做生命一般细心雕琢。目前对于项目架构而言,基本都会需要设计的几个架构。1、业务架构项目或者产品的市场定位、需求范围、作用场景都是需要在项目启动初期进行系统性分析的。在设计业务架构中,架构师还需要明

    2022年5月26日
    40
  • eclipse的svn使用教程_eclipse svn插件安装

    eclipse的svn使用教程_eclipse svn插件安装  SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。所有的版本信…

    2022年9月25日
    0
  • php-max_execution_time

    php-max_execution_time

    2021年10月24日
    48
  • django 异常处理_migrate previous

    django 异常处理_migrate previous前言在讲解如何解决migrate报错原因前,我们先要了解migrate做了什么事情,migrate:将新生成的迁移脚本。映射到数据库中。创建新的表或者修改表的结构。问题1:migrate怎么判断哪

    2022年7月29日
    4
  • iidea2022.01激活【2022.01最新】2022.01.24

    (iidea2022.01激活)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1TCF2R91JZ-eyJsaWNlbnNlSWQi…

    2022年3月31日
    57
  • (干货)结合Scikit-learn介绍几种常用的特征选择方法

    系统版本:window7(64bit)python版本:python3.5我的GitHub:https://github.com/weepon写在前面:前段时间正好用到特征选择的知识,有幸读到这篇文章,本文也主要参考这篇文章写成,但与原文章有不同之处:第一、纠正了原始文章中的代码错误,使其能用python3.5正常运行;第二、增加了一些新的特征选择内容,使其更加完善。本文中

    2022年4月8日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号