当前位置: 首页 > news >正文

seo站长之家百度推广关键词排名在哪看

seo站长之家,百度推广关键词排名在哪看,个人信息展示html模板,腾讯云域名查询文章目录 命令模式的详细介绍C 代码示例C代码示例2 命令模式的详细介绍 定义与概念 命令模式属于行为型设计模式#xff0c;它旨在将一个请求封装成一个对象#xff0c;从而让你可以用不同的请求对客户端进行参数化#xff0c;将请求的发送者和接收者解耦#xff0c;并且能… 文章目录 命令模式的详细介绍C 代码示例C代码示例2 命令模式的详细介绍 定义与概念 命令模式属于行为型设计模式它旨在将一个请求封装成一个对象从而让你可以用不同的请求对客户端进行参数化将请求的发送者和接收者解耦并且能够方便地对请求进行排队、记录请求日志以及支持可撤销的操作等。例如在一个智能家居系统中有各种电器设备如灯、电视、空调等而用户可以通过遥控器类似调用者发出各种操作指令如开灯、关电视、调空调温度等这些指令就是不同的命令每个电器设备就是接收者它们知道如何具体执行对应的操作。通过命令模式可以把这些操作指令都封装成一个个独立的命令对象这样遥控器就可以方便地调用不同的命令来控制不同的电器而且便于系统进行扩展、管理和实现诸如撤销操作等功能。 角色构成及职责 命令Command接口或抽象类这是整个模式的核心抽象它声明了执行操作的方法通常是一个名为 execute 的纯虚函数在 C 中。其作用是为所有具体命令类提供统一的执行接口规范使得调用者可以用统一的方式来调用不同的具体命令。具体命令ConcreteCommand类实现了 Command 接口内部持有一个接收者Receiver对象的引用。在 execute 方法中它会调用接收者对象相应的方法来完成具体的操作。例如对于“开灯”这个具体命令它的 execute 方法里就会调用灯接收者对象的“点亮”方法来实际执行开灯操作。接收者Receiver类接收者是真正知道如何执行具体业务逻辑和操作的对象它包含了与实际操作相关的方法。不同的接收者对应不同的功能实体比如电器设备等每个接收者的方法实现了具体要做的事情像灯的亮灭、电视的开关频道切换等操作都是在接收者类里定义方法实现的。调用者Invoker类负责触发命令的执行它持有一个或多个命令对象的引用可以通过调用命令对象的 execute 方法来让命令生效。调用者可以管理命令的执行顺序例如可以将多个命令按顺序放入一个队列中然后依次执行也能方便地实现一些高级功能比如存储历史命令以便支持撤销和重做操作等。 优点 解耦请求发送者和接收者发送者不需要知道接收者具体的实现细节以及如何执行操作只需要调用命令对象的执行方法就行这样双方的依赖关系变得松散便于各自独立修改和扩展。方便实现撤销和重做功能通过记录已经执行过的命令对象可以很容易地实现撤销操作按照一定规则反向执行之前的命令以及重做操作再次执行已经撤销的命令这在很多应用场景中非常有用比如文本编辑器的撤销和重做功能。增强代码的可扩展性和可维护性新增加具体命令或者接收者都相对容易只需要实现对应的接口或者继承相应的抽象类然后按照规则整合到系统中即可不会对现有代码结构造成大规模的破坏。 缺点 增加了代码的复杂性引入了多个类和接口来实现命令模式相比于直接调用方法实现功能整体代码结构变得更复杂对于简单的场景来说可能有点“大材小用”会让代码理解和维护成本在一定程度上提高。可能存在过多的小类每一个具体的命令都需要对应一个具体命令类如果有大量不同的命令会导致类的数量增多不过这可以通过合理的设计和适当的抽象来缓解。 应用场景 图形界面操作例如在绘图软件中像绘制图形、移动图形、删除图形等操作都可以封装成不同的命令方便用户通过菜单、快捷键等方式触发也便于实现撤销和重做功能。游戏开发游戏中角色的各种动作如攻击、跳跃、移动等可以看作是不同的命令由玩家输入调用者触发然后游戏角色接收者执行相应的动作并且可以记录操作历史来实现一些回滚操作等功能。任务队列系统把不同的任务封装成命令放入队列中按照顺序依次执行便于对任务进行统一管理和调度比如后台服务器处理各种业务请求任务等场景。 C 代码示例 以下是一个简单的模拟遥控器控制电器设备的 C 代码示例体现了命令模式的基本结构和用法 #include iostream #include vector #include memory// 命令接口 class Command { public:virtual void execute() 0; };// 接收者 - 灯类代表一个可以被控制的电器设备 class Light { public:void turnOn(){std::cout Light is turned on. std::endl;}void turnOff(){std::cout Light is turned off. std::endl;} };// 具体命令 - 开灯命令 class LightOnCommand : public Command { private:std::shared_ptrLight light; public:LightOnCommand(std::shared_ptrLight l) : light(l) {}void execute() override{light-turnOn();} };// 具体命令 - 关灯命令 class LightOffCommand : public Command { private:std::shared_ptrLight light; public:LightOffCommand(std::shared_ptrLight l) : light(l) {}void execute() override{light-turnOff();} };// 调用者 - 遥控器类 class RemoteControl { private:std::vectorstd::shared_ptrCommand onCommands;std::vectorstd::shared_ptrCommand offCommands; public:RemoteControl(){onCommands.resize(7);offCommands.resize(7);}void setCommand(int slot, std::shared_ptrCommand onCommand, std::shared_ptrCommand offCommand){onCommands[slot] onCommand;offCommands[slot] offCommand;}void onButtonWasPushed(int slot) {if (onCommands[slot]) {onCommands[slot]-execute();}}void offButtonWasPushed(int slot) {if (offCommands[slot]){offCommands[slot]-execute();}} };int main() {// 创建灯对象std::shared_ptrLight livingRoomLight std::make_sharedLight();// 创建具体命令对象std::shared_ptrLightOnCommand livingRoomLightOn std::make_sharedLightOnCommand(livingRoomLight);std::shared_ptrLightOffCommand livingRoomLightOff std::make_sharedLightOffCommand(livingRoomLight);// 创建遥控器对象RemoteControl remote;remote.setCommand(0, livingRoomLightOn, livingRoomLightOff);// 按下遥控器开灯按钮remote.onButtonWasPushed(0);// 按下遥控器关灯按钮remote.offButtonWasPushed(0);return 0; } 在上述代码中 Command 接口定义了统一的执行操作的抽象方法 execute。Light 类作为接收者包含了灯的实际操作方法 turnOn 和 turnOff。LightOnCommand 和 LightOffCommand 是具体命令类它们分别关联了灯对象并在 execute 方法中调用对应的灯操作方法来实现开灯和关灯的命令功能。RemoteControl 类作为调用者通过 setCommand 方法可以设置不同按钮对应的开和关命令然后通过 onButtonWasPushed 和 offButtonWasPushed 方法来触发相应命令的执行模拟了遥控器控制灯的操作过程。 这个示例只是一个基础的展示你可以根据实际需求进一步扩展比如添加更多的电器设备和对应的命令或者实现命令的撤销、重做等功能就像前面介绍中提到的那样可以通过记录已执行的命令列表等方式来实现。 C代码示例2 #includeiostream #includelist using namespace std; //将一个请求封装成一个对象从而使你可用不同的请求对客户进行参数化//厨师类 class C_COOK { public:virtual void docooking(){cout111111111endl;} };//广东厨师 class GuangDongCook: public C_COOK { public:virtual void docooking(){cout广东菜淡、淡、淡endl;} };//四川厨师 class SiChuanCook: public C_COOK { public:virtual void docooking(){cout四川菜辣、辣、辣endl;} };//菜点 class Food { public:virtual void cook(){} };//广东菜 class Guangdongfood : public Food { private:C_COOK *m_cook; public:Guangdongfood(C_COOK *p_cook):m_cook(p_cook){}void cook(){m_cook-docooking();} };//四川菜 class SiChuanfood : public Food { private:C_COOK *m_cook; public:SiChuanfood(C_COOK *p_cook):m_cook(p_cook){}void cook(){m_cook-docooking();} };//服务员 class Waiter {listFood*ls; public:void SetOrder(Food *p_food){ls.push_back(p_food);}void POST(){listFood*::iterator itr ls.begin();for(;itr!ls.end();itr){std::couttypeid(*itr).name()endl;//打印出来类型在这里还是Food *类型(*itr)-cook();//对应的师傅开始做菜//在此处调用开始出现多态//第一次push进来的是 Food *sifood new SiChuanfood(m_suicook);//实际类型是 SiChuanfood * 当调用时进行RTTI运行时类型识别 识别为SiChuanfood*//进而调用 cout四川菜辣、辣、辣endl;}} };int main() {C_COOK *m_suicook new SiChuanCook();C_COOK*m_gdcook new GuangDongCook();Food *sifood new SiChuanfood(m_suicook);Food*gdfood new Guangdongfood(m_gdcook);Waiter xiaoli;xiaoli.SetOrder(sifood);//记录xiaoli.SetOrder(gdfood);//记录xiaoli.POST();//通知return 0; }输出如下 class Food * 四川菜辣、辣、辣 class Food * 广东菜淡、淡、淡 请按任意键继续. . . 如果要是再增加一个湖南菜这时需要加一个湖南菜的类和湖南厨师类代码如下 #includeiostream #includelist using namespace std; //将一个请求封装成一个对象从而使你可用不同的请求对客户进行参数化//厨师类 class C_COOK { public:virtual void docooking(){cout111111111endl;} };//广东厨师 class GuangDongCook: public C_COOK { public:virtual void docooking(){cout广东菜淡、淡、淡endl;} };//四川厨师 class SiChuanCook: public C_COOK { public:virtual void docooking(){cout四川菜辣、辣、辣endl;} };//湖南厨师 class HUnanCook: public C_COOK { public:virtual void docooking(){cout湖南菜贼辣、贼辣、贼辣endl;} };//菜点 class Food { public:virtual void cook(){} };//广东菜 class Guangdongfood : public Food { private:C_COOK *m_cook; public:Guangdongfood(C_COOK *p_cook):m_cook(p_cook){}void cook(){m_cook-docooking();} };//四川菜 class SiChuanfood : public Food { private:C_COOK *m_cook; public:SiChuanfood(C_COOK *p_cook):m_cook(p_cook){}void cook(){m_cook-docooking();} };//新增//湖南菜 class Hunanfood : public Food { private:C_COOK *m_cook; public:Hunanfood(C_COOK *p_cook):m_cook(p_cook){}void cook(){m_cook-docooking();} };//服务员 class Waiter {listFood*ls; public:void SetOrder(Food *p_food){ls.push_back(p_food);}void POST(){listFood*::iterator itr ls.begin();for(;itr!ls.end();itr){std::couttypeid(*itr).name()endl;//打印出来类型在这里还是Food *类型(*itr)-cook();//在此处调用开始出现多态//第一次push进来的是 Food *sifood new SiChuanfood(m_suicook);//实际类型是 SiChuanfood * 当调用时进行RTTI运行时类型识别 识别为SiChuanfood*//进而调用 cout四川菜辣、辣、辣endl;}} };int main() {C_COOK *m_suicook new SiChuanCook();C_COOK*m_gdcook new GuangDongCook();C_COOK*m_hncook new HUnanCook();Food *sifood new SiChuanfood(m_suicook);Food*gdfood new Guangdongfood(m_gdcook);Food*hnfood new Hunanfood(m_hncook);Waiter xiaoli;xiaoli.SetOrder(sifood);xiaoli.SetOrder(gdfood);xiaoli.SetOrder(hnfood);xiaoli.POST();return 0; }结果如下 class Food * 四川菜辣、辣、辣 class Food * 广东菜淡、淡、淡 class Food * 湖南菜贼辣、贼辣、贼辣 请按任意键继续. . .
http://www.pierceye.com/news/72802/

相关文章:

  • 医疗设备网站建设怎么做设计网页推荐
  • 最优做网站海宁建设局网站
  • 网站做适配手机要多久seo网络推广公司
  • 建设大型的企业网站费用wordpress 500 php版本
  • asp网站模板源码免费无限下载中小企业为什么要建网站
  • 网站建设客源在哪里找积分商城小程序
  • 博物馆网站微信公众号建设方案厦门网站建设哪家不错
  • 企业网站推广解决方案集团品牌官网建设
  • 宝安中心地铁站是几号线做网站编辑好还是新媒体编辑
  • 建设一个外贸网站多少钱安装网站程序
  • 南通营销平台网站建设邳州市建设局官方网站
  • 济源做网站那里可以做工作室做网站
  • 德阳市建设局官方网站f福州网站建设公司
  • flash做网站导航手机银行网站建设
  • 网站可以做软件检测吗违规网站备案
  • 基于5G的网站设计南宁做网站 的
  • 衡水网站制作多少钱代做标书网站
  • logo网站设计论文做100个网站
  • 淘宝网站的建设与运营设计思路网站建设 技术 哪些方面
  • 企业网站搜索引擎推广方法自己的网站 做采集怎么做
  • 网站备案号找回密码衡阳网站建设专家
  • 上饶做网站最好的公司个人社保缴费年限怎么查询
  • 通州广州网站建设做视频素材哪个网站好
  • 在线解压缩网站世界十大软件公司排名
  • 外贸邦seo关键词优化怎么收费
  • led灯什么网站做推广好厦门网站建设维护
  • 坂田网站建设wordpress静态规则
  • 包装设计网站资源彩票网站怎么做赚钱吗
  • 如何用c 做网站背景微信免费推广平台
  • 做本地生活网站离石做网站