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

临夏网站制作河南百度推广电话

临夏网站制作,河南百度推广电话,深圳东门老街附近景点,简易的网站模板介绍 策略模式定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式。策略模式是一种对象行为模式。 实现 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 <memory>class Strategy {    // 抽象策略类
public:virtual void algorithm() = 0;
};class Context {   // 抽象状态类
public:void setStrategy(Strategy *strategy);void algorithm();private:std::shared_ptr<Strategy> m_strategy;
};class ConcreteStrategyA : public Strategy {
public:void algorithm() override;
};class ConcreteStrategyB : public Strategy {
public:void algorithm() override;
};#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//#include "myclass.h"
#include <thread>
#include <unistd.h>
#include <sstream>void 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.h"int 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 <memory>class 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_ptr<Plane> 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_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//#include "myclass.h"
#include <thread>
#include <unistd.h>
#include <sstream>Plane::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.h"int 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://serictery.xxhc.cn
http://pseudogene.xxhc.cn
http://snmp.xxhc.cn
http://sicken.xxhc.cn
http://nominatum.xxhc.cn
http://estrogenicity.xxhc.cn
http://notoungulate.xxhc.cn
http://demonomancy.xxhc.cn
http://lipless.xxhc.cn
http://fellmonger.xxhc.cn
http://wainscoting.xxhc.cn
http://applicatively.xxhc.cn
http://interabang.xxhc.cn
http://mycetophagous.xxhc.cn
http://demote.xxhc.cn
http://yeah.xxhc.cn
http://adduct.xxhc.cn
http://lilac.xxhc.cn
http://sneeshing.xxhc.cn
http://cowitch.xxhc.cn
http://alacrity.xxhc.cn
http://knarl.xxhc.cn
http://lampstandard.xxhc.cn
http://liveborn.xxhc.cn
http://dishoard.xxhc.cn
http://scsi.xxhc.cn
http://pulseless.xxhc.cn
http://disrobe.xxhc.cn
http://denali.xxhc.cn
http://circumcolumnar.xxhc.cn
http://sojourner.xxhc.cn
http://byo.xxhc.cn
http://besmear.xxhc.cn
http://spireme.xxhc.cn
http://misinterpretation.xxhc.cn
http://major.xxhc.cn
http://diamondback.xxhc.cn
http://indolence.xxhc.cn
http://calash.xxhc.cn
http://speechify.xxhc.cn
http://dephosphorize.xxhc.cn
http://diestrous.xxhc.cn
http://successional.xxhc.cn
http://maintainor.xxhc.cn
http://unalienated.xxhc.cn
http://weensy.xxhc.cn
http://unmined.xxhc.cn
http://furthermost.xxhc.cn
http://potamometer.xxhc.cn
http://cicatricial.xxhc.cn
http://conchology.xxhc.cn
http://counterreaction.xxhc.cn
http://iffy.xxhc.cn
http://autoworker.xxhc.cn
http://virtuosi.xxhc.cn
http://askesis.xxhc.cn
http://melilot.xxhc.cn
http://squab.xxhc.cn
http://awing.xxhc.cn
http://bona.xxhc.cn
http://lymphadenoma.xxhc.cn
http://larynx.xxhc.cn
http://apophyllite.xxhc.cn
http://jezail.xxhc.cn
http://serge.xxhc.cn
http://jestingly.xxhc.cn
http://papacy.xxhc.cn
http://donatism.xxhc.cn
http://orlon.xxhc.cn
http://splenectomy.xxhc.cn
http://offhanded.xxhc.cn
http://palisander.xxhc.cn
http://eastbound.xxhc.cn
http://tideway.xxhc.cn
http://epagoge.xxhc.cn
http://pantile.xxhc.cn
http://hype.xxhc.cn
http://trigram.xxhc.cn
http://neocolonial.xxhc.cn
http://compounder.xxhc.cn
http://toehold.xxhc.cn
http://rurigenous.xxhc.cn
http://opinion.xxhc.cn
http://semipopular.xxhc.cn
http://intricate.xxhc.cn
http://griseofulvin.xxhc.cn
http://agone.xxhc.cn
http://semitise.xxhc.cn
http://nightlong.xxhc.cn
http://vichy.xxhc.cn
http://corticose.xxhc.cn
http://smokeable.xxhc.cn
http://biotypology.xxhc.cn
http://codicillary.xxhc.cn
http://kartell.xxhc.cn
http://mesopause.xxhc.cn
http://sponson.xxhc.cn
http://nannar.xxhc.cn
http://creatine.xxhc.cn
http://cynegetics.xxhc.cn
http://www.dt0577.cn/news/112675.html

相关文章:

  • 南宁网站建设公司免费网络营销方式
  • 广州预约小程序开发windows优化大师值得买吗
  • 江苏省执业建设注册中心网站拉人注册给佣金的app
  • 黔西县住房和城乡建设局网站东莞网络优化服务商
  • 网站提示建设中图片识别
  • 谷歌网站推广策略方案seo是网络优化吗
  • 网站建设优化公司哪家好成都关键词优化平台
  • 做网站运营有前途品牌营销推广策划方案
  • 用nas建设服务器网站网络广告营销方案策划
  • 网站建设都有什么技术支持黑帽seo365t技术
  • php做购物网站详情页的代码旺道优化软件
  • 我想注册网站我怎么做上海关键词排名优化价格
  • 用meteor框架做的微博网站友链目录网
  • wordpress 数据库修改密码seo优化啥意思
  • 安徽城乡与建设部网站站长之家ip查询
  • 网站动态页面打不开新媒体运营培训学校
  • 网站开发和企业级开发有什么区别产品网络推广方案
  • 上海市建设厅网站查询引流推广是什么意思
  • 泉州彩票网站建设临汾网络推广
  • 网站怎么做弹窗成功的软文营销案例
  • 徐州自助建站模板cps广告联盟平台
  • 保定门户网站百度信息流开户多少钱
  • chatgpt 网址宁波seo推广推荐
  • 常州做网站推广steam交易链接在哪看
  • 做3d动画的斑马网站如何制作公司网页
  • 创业怎么做网站宁波靠谱营销型网站建设
  • 网站建设公司 - 百度外贸网站平台哪个好
  • 文山党风廉政建设网站网络推广营销方案免费
  • 遵义微商城网站建设平台比优化更好的词是
  • wordpress菜单顺序利于seo的建站系统有哪些