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

邢台推广网站建设电话深圳网站域名

邢台推广网站建设电话,深圳网站域名,seo公司seo教程,dw设计一个简单网站介绍 策略模式定义一系列算法类#xff0c;将每一个算法封装起来#xff0c;并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化#xff0c;也称为政策模式。策略模式是一种对象行为模式。 实现 myclass.h // // Created by yuwp on 2024/1/12. //#ifndef DES…介绍 策略模式定义一系列算法类将每一个算法封装起来并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化也称为政策模式。策略模式是一种对象行为模式。 实现 myclass.h // // Created by yuwp on 2024/1/12. //#ifndef DESIGNPATTERNS_MYCLASS_H #define DESIGNPATTERNS_MYCLASS_H#include iostream #include unordered_map #include atomic #include vector #include memoryclass Strategy { // 抽象策略类 public:virtual void algorithm() 0; };class Context { // 抽象状态类 public:void setStrategy(Strategy *strategy);void algorithm();private:std::shared_ptrStrategy m_strategy; };class ConcreteStrategyA : public Strategy { public:void algorithm() override; };class ConcreteStrategyB : public Strategy { public:void algorithm() override; };#endif //DESIGNPATTERNS_MYCLASS_Hmyclass.cpp // // Created by yuwp on 2024/1/12. //#include myclass.h #include thread #include unistd.h #include sstreamvoid Context::setStrategy(Strategy *strategy) {m_strategy.reset(strategy); }void Context::algorithm() {if (m_strategy) {m_strategy-algorithm();} else {std::cout 当前没有策略 std::endl;} }void ConcreteStrategyA::algorithm() {std::cout 采用策略A std::endl; }void ConcreteStrategyB::algorithm() {std::cout 采用策略B std::endl; }main.cpp #include iostream #include mutex #include myclass.hint main() {Strategy *strategyA new ConcreteStrategyA;Strategy *strategyB new ConcreteStrategyB;Context *context new Context;context-setStrategy(strategyA);context-algorithm();context-setStrategy(strategyB);context-algorithm();delete context;return 0; } 总结 优点 1. 策略模式提供了对开闭原则的完美支持。用户可以在不修改原有系统的基础上选择算法或行为也可以灵活地增加新的算法或行为。 2. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族恰当使用继承可以把公共的代码移到抽象策略类中从而避免重复代码。 3. 策略模式提供了一种可以替换继承关系的办法。如果不使用策略模式那么使用算法的环境类就可能会有一些子类每一个子类提供一种不同的算法。但是这样一来算法的使用就和算法本身混在一起不符合单一职责原则。决定使用哪一种算法的逻辑和该算法本身混合在一起从而不可能再独立演化而且使用继承无法实现算法或行为在程序运行时的动态切换。 4. 使用策略模式可以避免多重条件选择语句。多重条件选择语句不易维护它把采取哪一种算法或行为的逻辑与算法或行为本身的实现逻辑混合在一起将它们全部硬编码Hard Coding在一个庞大的多重条件选择语句中比直接继承环境类的办法还要原始和落后。 5. 策略模式提供了一种算法的复用机制。由于将算法单独提取出来封装在策略类中因此不同的环境类可以方便地复用这些策略类。 缺点 1. 客户端必须知道所有的策略类并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别以便适时选择恰当的算法。换言之策略模式只适用于客户端知道所有的算法或行为的情况。 2. 策略模式将造成系统产生很多具体策略类。任何细小的变化都将导致系统要增加一个新的具体策略类。 3. 无法同时在客户端使用多个策略类。也就是说在使用策略模式时客户端每次只能使用一个策略类不支持使用一个策略类完成部分功能后再使用另一个策略类来完成剩余功能的情况。 适用场景 1. 一个系统需要动态地在几种算法中选择一种。可以将这些算法封装到一个个的具体算法类中而这些具体算法类都是一个抽象算法类的子类。换言之这些具体算法类均具有统一的接口。根据里氏代换原则和面向对象的多态性客户端可以选择使用任何一个具体算法类并只需要维持一个数据类型是抽象算法类的对象。 2. 一个对象有很多的行为如果不用恰当的模式这些行为就只好使用多重条件选择语句来实现。此时使用策略模式把这些行为转移到相应的具体策略类里面就可以避免使用难以维护的多重条件选择语句。 3. 不希望客户端知道复杂的、与算法相关的数据结构。在具体策略类中封装算法与相关的数据结构可以提高算法的保密性与安全性。 练习 myclass.h // // Created by yuwp on 2024/1/12. //#ifndef DESIGNPATTERNS_MYCLASS_H #define DESIGNPATTERNS_MYCLASS_H#include iostream #include unordered_map #include atomic #include vector #include memoryclass TakeOff { // 起飞抽象策略类 public:virtual void takeOff() 0; // 起飞 };class Flight { // 飞行抽象策略类 public:virtual void flight() 0; // 飞行 };class Plane { public:Plane(TakeOff *takeOff, Flight *flight);virtual ~Plane();virtual void takeOff();virtual void flight(); private:TakeOff *m_takeoff;Flight *m_flight; };class Simulator { // 模拟系统 public:void setPlane(Plane *plane);void start();private:std::shared_ptrPlane m_plane; };class VerticalTakeOff : public TakeOff { // 垂直起飞策略类 public:void takeOff() override; };class LongDistanceTakeOff : public TakeOff { // 长距离起飞策略类 public:void takeOff() override; };class SubSonicFly : public Flight { // 亚音速飞行策略类 public:void flight() override; };class SuperSonicFly : public Flight { // 超音速飞行策略类 public:void flight() override; };class Helicopter : public Plane { // 直升机 public:Helicopter();void takeOff() override;void flight() override; };class AirPlane : public Plane { // 客机 public:AirPlane();void takeOff() override;void flight() override; };class FighterPlane : public Plane { // 歼击机 public:FighterPlane();void takeOff() override;void flight() override; };class HarrierPlane : public Plane { // 鹞式战斗机 public:HarrierPlane();void takeOff() override;void flight() override; };#endif //DESIGNPATTERNS_MYCLASS_Hmyclass.cpp // // Created by yuwp on 2024/1/12. //#include myclass.h #include thread #include unistd.h #include sstreamPlane::Plane(TakeOff *takeOff, Flight *flight) {m_takeoff takeOff;m_flight flight; }Plane::~Plane() {if (m_takeoff) {delete m_takeoff;}if (m_flight) {delete m_flight;} }void Plane::takeOff() {if (m_takeoff) {m_takeoff-takeOff();} else {std::cout 没有设置起飞特征 std::endl;} }void Plane::flight() {if (m_flight) {m_flight-flight();} else {std::cout 没有设置飞行特征 std::endl;} }void Simulator::setPlane(Plane *plane) {m_plane.reset(plane); }void Simulator::start() {if (m_plane) {m_plane-takeOff();m_plane-flight();} else {std::cout 请先设置飞机种类 std::endl;} }void VerticalTakeOff::takeOff() {std::cout 垂直起飞 std::endl; }void LongDistanceTakeOff::takeOff() {std::cout 长距离起飞 std::endl; }void SubSonicFly::flight() {std::cout 亚音速飞行 std::endl; }void SuperSonicFly::flight() {std::cout 超音速飞行 std::endl; }Helicopter::Helicopter() : Plane(new VerticalTakeOff(), new SubSonicFly()) {}void Helicopter::takeOff() {std::cout 直升机开始起飞 std::endl;Plane::takeOff(); }void Helicopter::flight() {std::cout 直升机开始飞行 std::endl;Plane::flight(); }AirPlane::AirPlane() : Plane(new LongDistanceTakeOff(), new SubSonicFly()) {}void AirPlane::takeOff() {std::cout 客机开始起飞 std::endl;Plane::takeOff(); }void AirPlane::flight() {std::cout 客机开始飞行 std::endl;Plane::flight(); }FighterPlane::FighterPlane() : Plane(new LongDistanceTakeOff(), new SuperSonicFly()) {}void FighterPlane::takeOff() {std::cout 歼击机开始起飞 std::endl;Plane::takeOff(); }void FighterPlane::flight() {std::cout 歼击机开始飞行 std::endl;Plane::flight(); }HarrierPlane::HarrierPlane() : Plane(new VerticalTakeOff(), new SuperSonicFly()) {}void HarrierPlane::takeOff() {std::cout 鹞式战斗机开始起飞 std::endl;Plane::takeOff(); }void HarrierPlane::flight() {std::cout 鹞式战斗机开始飞行 std::endl;Plane::flight(); }main.cpp #include iostream #include mutex #include myclass.hint main() {Simulator *simulator new Simulator();Plane *plane new Helicopter();simulator-setPlane(plane);simulator-start();std::cout ---------------------- std::endl;plane new AirPlane();simulator-setPlane(plane);simulator-start();std::cout ---------------------- std::endl;plane new FighterPlane();simulator-setPlane(plane);simulator-start();std::cout ---------------------- std::endl;plane new HarrierPlane();simulator-setPlane(plane);simulator-start();delete simulator;return 0; }
http://www.dnsts.com.cn/news/19024.html

相关文章:

  • 做网站后台怎么弄网址例子
  • 上海做网站设计的公司google 网站突然一条收录也没有
  • 电影网站制作模版wordpress搭建cms网站
  • 免费外链网站软件开发专业技能怎么写
  • 网站开发定制方案上海做网站推广公司
  • 东莞设计网站推荐南宁手机建站模板
  • php开源建站系统sem和seo
  • 聊城汽车网站建设广东两学一做考试网站
  • 张家口网站seo安徽合肥做网站的公司有哪些
  • 万网主机 wordpress手机网站关键词seo
  • 程序员做个网站要多少钱呢网站服务器空间租用
  • 网上商城网站开发广州制作网站报价
  • 建视频网站需要多少钱西安电子科技大学信息化建设处网站
  • 人力资源网站怎么建设网站营销推广计划书
  • 南宁营销型网站建设公司哪家好百度申请完域名怎么建设网站
  • 做cpa广告网站教程免费建网站可信吗
  • 网站开发ide php网站开发和美工的区别
  • 中新生态城建设局门户网站湖南星大建设集团有限公司网站
  • html静态网站下载wordpress导航怎么添加文章
  • 重庆网站托管贵阳营销网站建设公司
  • 网站建设及推广费记什么科目wordpress 网校插件
  • 各大搜索引擎网站提交入口大全网络广告的发布渠道有哪些
  • 手机网站建设报价php做彩票网站
  • 网站开发思路怎么写机械加工网站模板
  • 动态域名做网站官方app下载立即下载
  • 网站流量数据网站栏目相关内容在哪采集啊
  • 用fullpage做的网站网站推广费计入什么科目
  • 济南网站建设 齐鲁文化创意基地用centos搭建wordpress
  • 网站建设整体解决方案四川住建厅考试报名官网
  • 昆山网站建设公司网络门户网站