码迷,mamicode.com
首页 > 其他好文 > 详细

[设计模式] 设计模式课程(二十)--命令模式

时间:2020-06-08 13:05:33      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:编译   替代   信息   gif   roc   干什么   RoCE   ima   函数   

概述

  • “行为变化”模式:组件构建过程中,组件行为的变化经常会导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合
  • 动机:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——如需要对行为进行“记录、撤销(redo/undo)”等处理,这种无法抵御变化的紧耦合是不合适的
  • 如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可实现二者间的松耦合
  • GoF:一个请求(行为)封装对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,及支持可撤销的操作
  • 封装:创建对象的过程
  • 对象能干什么:当做参数传递,当做字段存储,序列化,存在数据结构里(灵活性)
  • Command模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”
  • 实现Command接口的具体命令对象ConcreteCommand有时根据需要可能会保存一些额外的信息,通过使用Composite模式,可能将多个“命令”封装为一个“复合命令”MacroCommand
  • Command模式与C++中的函数对象有些类似(都实现了行为对象化),但两者定义行为接口的规范有所区别:Command以面向对象中的“接口-实现”来定义行为接口规范,更严格,但有性能损失(运行时绑定);C++函数对象以函数签名来定义行为接口规范,更灵活,性能更高(编译时绑定)
  • C++中一般用函数对象+泛型编程替代(性能高),在 Java, C#, Swift 中应用广泛
  • 一种观点:设计模式是弥补语言模式的不足而出现

技术图片

示例1

Command.cpp

技术图片
 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 using namespace std;
 5 
 6 class Command
 7 {
 8 public:
 9     virtual void execute() = 0;
10 };
11 
12 class ConcreteCommand1 : public Command
13 {
14     string arg;
15 public:
16     ConcreteCommand1(const string & a) : arg(a) {}
17     void execute() override
18     {
19         cout<< "#1 process..."<<arg<<endl;
20     }
21 };
22 
23 class ConcreteCommand2 : public Command
24 {
25     string arg;
26 public:
27     ConcreteCommand2(const string & a) : arg(a) {}
28     void execute() override
29     {
30         cout<< "#2 process..."<<arg<<endl;
31     }
32 };
33         
34 class MacroCommand : public Command
35 {
36     vector<Command*> commands;
37 public:
38     void addCommand(Command *c) { commands.push_back(c); }
39     void execute() override
40     {
41         for (auto &c : commands)
42         {
43             c->execute();
44         }
45     }
46 };
47         
48 int main()
49 {
50 
51     ConcreteCommand1 command1(receiver, "Arg ###");
52     ConcreteCommand2 command2(receiver, "Arg $$$");
53     
54     MacroCommand macro;
55     macro.addCommand(&command1);
56     macro.addCommand(&command2);
57     
58     macro.execute();
59 
60 }
View Code
  • 43:运行时辨析,c的具体类型决定excute()操作是什么
  • 51-52:创建命令
  • 54-56:组合命令
  • 58:执行命令

 

[设计模式] 设计模式课程(二十)--命令模式

标签:编译   替代   信息   gif   roc   干什么   RoCE   ima   函数   

原文地址:https://www.cnblogs.com/cxc1357/p/12324142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!