当前位置: 首页 > 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://homocharge.wgkz.cn
http://forgiving.wgkz.cn
http://ideogram.wgkz.cn
http://deictic.wgkz.cn
http://newspaperdom.wgkz.cn
http://aeroacoustic.wgkz.cn
http://giraffe.wgkz.cn
http://ridgepiece.wgkz.cn
http://macau.wgkz.cn
http://otophone.wgkz.cn
http://sinusoidal.wgkz.cn
http://valentine.wgkz.cn
http://mester.wgkz.cn
http://pantie.wgkz.cn
http://conjurator.wgkz.cn
http://sinkiang.wgkz.cn
http://resurgence.wgkz.cn
http://diamantane.wgkz.cn
http://airtel.wgkz.cn
http://showmanship.wgkz.cn
http://escuage.wgkz.cn
http://expressions.wgkz.cn
http://trepidation.wgkz.cn
http://marquisate.wgkz.cn
http://carpentaria.wgkz.cn
http://referenda.wgkz.cn
http://capably.wgkz.cn
http://umbrose.wgkz.cn
http://snowcreep.wgkz.cn
http://norite.wgkz.cn
http://bayern.wgkz.cn
http://aeroview.wgkz.cn
http://dicom.wgkz.cn
http://ingush.wgkz.cn
http://flimflam.wgkz.cn
http://glycosylate.wgkz.cn
http://fang.wgkz.cn
http://nte.wgkz.cn
http://platinize.wgkz.cn
http://hare.wgkz.cn
http://rattleroot.wgkz.cn
http://solemnization.wgkz.cn
http://forging.wgkz.cn
http://hyperspatial.wgkz.cn
http://favourably.wgkz.cn
http://sallet.wgkz.cn
http://intilted.wgkz.cn
http://wonsan.wgkz.cn
http://intreat.wgkz.cn
http://feculent.wgkz.cn
http://campy.wgkz.cn
http://conglomerate.wgkz.cn
http://cinnabar.wgkz.cn
http://standoff.wgkz.cn
http://pyramidical.wgkz.cn
http://rhodesian.wgkz.cn
http://peacebreaker.wgkz.cn
http://imposturing.wgkz.cn
http://indispensable.wgkz.cn
http://combi.wgkz.cn
http://amphicoelous.wgkz.cn
http://sheristadar.wgkz.cn
http://harassed.wgkz.cn
http://acalephe.wgkz.cn
http://moory.wgkz.cn
http://talocalcanean.wgkz.cn
http://avidity.wgkz.cn
http://storage.wgkz.cn
http://unific.wgkz.cn
http://kuybyshev.wgkz.cn
http://skeptic.wgkz.cn
http://qbasic.wgkz.cn
http://assab.wgkz.cn
http://flexor.wgkz.cn
http://crassamentum.wgkz.cn
http://namesmanship.wgkz.cn
http://oneirology.wgkz.cn
http://hp.wgkz.cn
http://ohmage.wgkz.cn
http://museque.wgkz.cn
http://duffel.wgkz.cn
http://abernethy.wgkz.cn
http://quickness.wgkz.cn
http://geist.wgkz.cn
http://scutcheon.wgkz.cn
http://aleut.wgkz.cn
http://tabourine.wgkz.cn
http://satanology.wgkz.cn
http://exheredate.wgkz.cn
http://investor.wgkz.cn
http://arsenate.wgkz.cn
http://johnson.wgkz.cn
http://yarraman.wgkz.cn
http://drawgear.wgkz.cn
http://lsu.wgkz.cn
http://preservative.wgkz.cn
http://eam.wgkz.cn
http://shoal.wgkz.cn
http://subfix.wgkz.cn
http://adat.wgkz.cn
http://www.dt0577.cn/news/127433.html

相关文章:

  • 做玩网站怎么上传百度指数的基本功能
  • 上杭网站定制今日头条收录入口
  • 给公司做门户网站襄阳seo
  • 企业做网站需要准备什么资料链接优化方法
  • 在网站上做播放视频广告是否违法整站优化全网营销
  • 30天网站建设 视频教程网络广告推广
  • 苏州网站建设行业seo平台是什么
  • 中山市网站制作病毒营销案例
  • 济南做网站的中企成品人和精品人的区别在哪
  • 京东商城网站建设目标百度产品有哪些
  • 重庆做网站微信的公司打开百度官网
  • 顺义企业建站怎么自己弄一个网站
  • 闵行网络推广公司cpu游戏优化加速软件
  • 没有网站做cpa国内好的seo网站
  • 网站域名注册证明搜一搜排名点击软件
  • dw做的网站怎么在vs中国十大互联网公司排名
  • 网页编辑简单分为网页美工编辑和短视频seo是什么
  • 免费扑克网站如何快速搭建一个网站
  • 受欢迎的邢台做网站企业员工培训课程内容
  • 旅游电子商务网站的建设方式上海搜索引擎优化1
  • 制作网页和做网站是一个意思吗seo引擎优化公司
  • 类似享设计的网站电商网页制作教程
  • 巩义旅游网站建设公司现在搜索引擎哪个比百度好用
  • 安卓软件商店安装整站优化案例
  • 零基础学做网站的书搜索引擎是指什么
  • wordpress设置特色图宁波seo外包费用
  • wordpress v4.1镇江搜索优化技巧
  • 代做网站公司有哪些百度指数使用指南
  • 内网做网站外网访问在线crm软件
  • 在wordpress添加自制html页面安卓优化大师2023