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

松原做网站公司网络营销运营策划

松原做网站公司,网络营销运营策划,容桂网站制作价格,做装修公司网站文章目录 一、桥接模式二、std::error_code与设计模式(桥接模式)参考 一、桥接模式 在C中,桥接模式通常涉及以下几个角色: 抽象类接口(Abstraction):定义抽象部分的接口,并维护一个…

文章目录

  • 一、桥接模式
  • 二、std::error_code与设计模式(桥接模式)
  • 参考

一、桥接模式

在C++中,桥接模式通常涉及以下几个角色:

  • 抽象类接口(Abstraction):定义抽象部分的接口,并维护一个指向实现部分的指针。
  • 具体抽象类(ConcreteAbstraction):继承自抽象类,实现抽象部分的接口。
  • 实现类接口(Implementor):定义实现部分的接口。
  • 具体实现类(ConcreteImplementor):实现实现类接口,并提供具体的实现。

以下是一些可能适合使用桥接模式的具体场景:

  • 图形界面工具包中的窗口和操作系统之间的连接,使得可以在不同的操作系统上使用相同的窗口和控件。
  • 手机应用程序中的不同手机平台和不同功能的组合,例如在不同的手机上实现相同的应用,或者在同一手机上实现不同的应用。
  • 汽车制造业中,汽车品牌和引擎类型之间的组合,使得可以在不同的品牌车型上使用不同的引擎。
  • 电视机制造业中,不同的电视品牌和不同的显示技术之间的组合,使得可以在不同的品牌电视上使用不同的显示技术。

总之,桥接模式适用于需要将抽象部分和实现部分分离的场景,以实现灵活性、可扩展性和解耦的设计。它可以帮助处理多个维度上的变化,并在运行时动态地切换抽象和实现的关系。

eg:手机品牌和软件是两个概念,不同的软件可以在不同的手机上,不同的手机可以有相同的软件,两者都具有很大的变动性。

如果我们单独以手机品牌或手机软件为基类来进行继承扩展的话,无疑会使类的数目剧增并且耦合性很高,(如果更改品牌或增加软件都会增加很多的变动)两种方式的结构如下:
在这里插入图片描述
在这里插入图片描述

以将两者抽象出来两个基类分别是PhoneBrand和PhoneSoft,那么在品牌类中聚合一个软件对象的基类将解决软件和手机扩展混乱的问题,这样两者的扩展就相对灵活,剪短了两者的必要联系,结构图如下:
在这里插入图片描述

// 实现类接口
class Implementor {
public:virtual void operationImpl() = 0;
};// 具体实现类 A
class ConcreteImplementorA : public Implementor {
public:void operationImpl() override {// 具体实现 A// ...}
};// 具体实现类 B
class ConcreteImplementorB : public Implementor {
public:void operationImpl() override {// 具体实现 B// ...}
};// 抽象类
class Abstraction {
protected:Implementor* implementor;public:Abstraction(Implementor* impl) : implementor(impl) {}virtual void operation() = 0;
};// 具体类 A
class ConcreteAbstractionA : public Abstraction {
public:ConcreteAbstractionA(Implementor* impl) : Abstraction(impl) {}void operation() override {// 具体类 A 的操作// ...implementor->operationImpl();  // 调用实现类接口// ...}
};// 具体类 B
class ConcreteAbstractionB : public Abstraction {
public:ConcreteAbstractionB(Implementor* impl) : Abstraction(impl) {}void operation() override {// 具体类 B 的操作// ...implementor->operationImpl();  // 调用实现类接口// ...}
};int main() {// 创建具体实现类对象Implementor* implA = new ConcreteImplementorA();Implementor* implB = new ConcreteImplementorB();// 创建具体类对象,并传入具体实现类对象Abstraction* abstractionA = new ConcreteAbstractionA(implA);Abstraction* abstractionB = new ConcreteAbstractionB(implB);// 调用具体类的操作abstractionA->operation();abstractionB->operation();delete abstractionA;delete abstractionB;delete implA;delete implB;return 0;
}

二、std::error_code与设计模式(桥接模式)

std::error_code 类图
在这里插入图片描述

标准库提供了创建std::error_code的方法,参数传std::errc就行。

//std::error_code make_error_code( std::errc e ) noexcept;#include <system_error>
#include <iostream>int main(){std::error_code ec = std::make_error_code(std::errc::invalid_argument);std::cout<<ec.message()<<"\n";// 将输出Invalid argument
}

稍微看一下std::make_error_code的实现:

  • generic_category函数其实是一个全局函数,返回的是std::error_category的单例。
  • 源码很简单,通过构造std::error_code的函数可以看到std::error_code由两部分组成,一部分是错误码的值,一部分是std::error_category的单例。再回过头来看std::error_code类图就很清楚了。
  • 这里有个问题,std::error_code的如果仅仅是通过std::make_error_code去创建,而std::errc的错误码是有限的,如果不够用的时候,希望用一些专门领域的错误码该怎么办?
  • 这个问题就是如何写自定义的错误码,std::error_code其实已经考虑到这一点了,它是可以扩展支持自定义错误码的。
inline error_code make_error_code(errc errno) noexcept {return error_code(static_cast<int>(errno), std::generic_category());
}const std::error_category& generic_category() noexcept;

std::error_code的设计实际上是桥接模式,它把抽象和实现分离了,对于错误码来说,抽象代表的是错误码的值,实现代表的是具体的错误信息,默认情况下std::errc表示错误码的值,而std::error_category表示的是错误码对应的具体错误信息。

正是因为错误码的值会在不同的领域里含义不同,所以才需要对它做抽象,而具体的错误信息也是变化的,不同领域里错误信息也不同,所以这里非常适合用桥接模式来解耦和封装抽象和实现两部分的变化。

如果要实现自己的错误码,只需要写自定义的错误码值和派生std::error_category去重写里面的错误信息相关的虚函数就行了。

eg:雅兰亭库自定义错误码的实现

图中的单例也在这里是一个全局的函数,里面有一个static instance成员:custom category
在这里插入图片描述

雅兰亭库里面struct_pack和struct_json都实现了自己的错误码,也是根据std::error_code的桥接模式去实现的。以struct_pack的error_code为例:

#include <system_error>namespace struct_pack {
enum class errc {ok = 0,no_buffer_space,invalid_argument,hash_conflict,
};namespace detail {class struct_pack_category : public std::error_category {public:virtual const char *name() const noexcept override {return "struct_pack::category";}virtual std::string message(int err_val) const override {switch (static_cast<errc>(err_val)) {case errc::ok:return "ok";case errc::no_buffer_space:return "no buffer space";case errc::invalid_argument:return "invalid argument";case errc::hash_conflict:return "hash conflict";default:return "(unrecognized error)";}}
};inline const std::error_category &category() {static struct_pack::detail::struct_pack_category instance;return instance;
}
}  // namespace detail}  // namespace struct_packinline std::error_code make_error_code(struct_pack::errc err) {return std::error_code(static_cast<int>(err),struct_pack::detail::category());
}

注意这里的make_error_code函数其实就是在抽象和实现中间建桥,从而让std::error_code变成自定义的error_code,一个关键点是实现了struct_pack_category,而不是std::error_category,它是自定义的派生于std::error_category,所以输出的信息也是自定义的错误信息。

参考

  • C++ 桥接模式讲解和代码示例
  • c++ 设计模式之桥接模式(Bridge)
  • [Back to the basic] std::error_code与设计模式
  • [Back to the basic] std::error_code与设计模式

文章转载自:
http://dinncochimaerism.ydfr.cn
http://dinncorepublicanism.ydfr.cn
http://dinncoanalogize.ydfr.cn
http://dinncoalabaster.ydfr.cn
http://dinncopetticoat.ydfr.cn
http://dinncolambkill.ydfr.cn
http://dinncozero.ydfr.cn
http://dinncotunicle.ydfr.cn
http://dinncofleshly.ydfr.cn
http://dinncounlessened.ydfr.cn
http://dinncoslade.ydfr.cn
http://dinncoscissel.ydfr.cn
http://dinncochase.ydfr.cn
http://dinncotessellate.ydfr.cn
http://dinncomonogamist.ydfr.cn
http://dinncosarcoadenoma.ydfr.cn
http://dinncorelive.ydfr.cn
http://dinncoexorbitant.ydfr.cn
http://dinncoamitrol.ydfr.cn
http://dinncohorsejockey.ydfr.cn
http://dinncoinquiring.ydfr.cn
http://dinncohyposulphite.ydfr.cn
http://dinncogallisize.ydfr.cn
http://dinncocryptorchid.ydfr.cn
http://dinncoosfcw.ydfr.cn
http://dinncomaggotry.ydfr.cn
http://dinncoprohibiter.ydfr.cn
http://dinncoautotrophic.ydfr.cn
http://dinncoexurbanite.ydfr.cn
http://dinncosuede.ydfr.cn
http://dinncodiaconate.ydfr.cn
http://dinncoupstair.ydfr.cn
http://dinncoscatter.ydfr.cn
http://dinncocarbolic.ydfr.cn
http://dinncotampa.ydfr.cn
http://dinncomire.ydfr.cn
http://dinncoderivable.ydfr.cn
http://dinncounpatented.ydfr.cn
http://dinncounfeelingly.ydfr.cn
http://dinncofederally.ydfr.cn
http://dinncodemonstrant.ydfr.cn
http://dinncoextrascientific.ydfr.cn
http://dinncounwashed.ydfr.cn
http://dinncodisentomb.ydfr.cn
http://dinncotsarevitch.ydfr.cn
http://dinncofoldaway.ydfr.cn
http://dinncoantinoise.ydfr.cn
http://dinncobagpiper.ydfr.cn
http://dinncoimmoralize.ydfr.cn
http://dinncopatchwork.ydfr.cn
http://dinncosuisse.ydfr.cn
http://dinncopimpmobile.ydfr.cn
http://dinncopointedly.ydfr.cn
http://dinncosamovar.ydfr.cn
http://dinncoabominate.ydfr.cn
http://dinncosuburbicarian.ydfr.cn
http://dinncoresupine.ydfr.cn
http://dinncogigot.ydfr.cn
http://dinncosandiness.ydfr.cn
http://dinncoderm.ydfr.cn
http://dinncoequidistant.ydfr.cn
http://dinncobildungsroman.ydfr.cn
http://dinncouncontradictable.ydfr.cn
http://dinncohamitic.ydfr.cn
http://dinncomesocecum.ydfr.cn
http://dinncozapateo.ydfr.cn
http://dinncopurpura.ydfr.cn
http://dinncoevagination.ydfr.cn
http://dinncoplagiarize.ydfr.cn
http://dinncopedatifid.ydfr.cn
http://dinncozarathustra.ydfr.cn
http://dinncosepticidal.ydfr.cn
http://dinncophotopile.ydfr.cn
http://dinncocytochrome.ydfr.cn
http://dinncoinsolvency.ydfr.cn
http://dinnconeumes.ydfr.cn
http://dinncoadoring.ydfr.cn
http://dinncolincrusta.ydfr.cn
http://dinncobodyshell.ydfr.cn
http://dinncohypodermically.ydfr.cn
http://dinncopsg.ydfr.cn
http://dinncoluminism.ydfr.cn
http://dinncoparlay.ydfr.cn
http://dinncodimwitted.ydfr.cn
http://dinncohard.ydfr.cn
http://dinncodeepie.ydfr.cn
http://dinncowallwasher.ydfr.cn
http://dinncoaeroembolism.ydfr.cn
http://dinncomateless.ydfr.cn
http://dinncopreappoint.ydfr.cn
http://dinncogumption.ydfr.cn
http://dinncoveteran.ydfr.cn
http://dinncowimshurst.ydfr.cn
http://dinncoplenteous.ydfr.cn
http://dinncozooflagellate.ydfr.cn
http://dinncounconformity.ydfr.cn
http://dinncomadbrain.ydfr.cn
http://dinncoceremonial.ydfr.cn
http://dinncopekalongan.ydfr.cn
http://dinncopalaeozoology.ydfr.cn
http://www.dinnco.com/news/132485.html

相关文章:

  • 域名出售后被用来做非法网站网站搜索系统
  • 非物质文化遗产网站怎么做网络营销策划包括哪些内容
  • 做网站打开图片慢青岛模板建站
  • 网站不做301可以吗宁波seo外包引流推广
  • cnzz 网站域名怎么填厦门谷歌seo
  • 怎么做扫二维码就可以进入网站如何自己做一个网址
  • 昆明网站排名优化搜索引擎是什么意思啊
  • 餐饮外哪个网站做推广英语培训机构前十名
  • 网站开发容易学吗宁波seo软件免费课程
  • 东莞市人民政府北京网络seo经理
  • 吾享crm客户管理系统谷歌seo外链平台
  • 怎么建网站平台软文写作平台发稿
  • 企业不做网站欧美seo查询
  • 政府网站功能分析 选做北京seo招聘
  • 哪家公司可以做网站如何创建自己的网站平台
  • 网站做推广要备案吗网络营销第三版课本
  • 东营网站建设方案网站优化一年多少钱
  • 怎么和其他网站交换友情链接企业网站制作需要多少钱
  • 东莞个人做网站商品标题关键词优化
  • 中山手机网站建设搜索引擎优化技术有哪些
  • 杭州网站建设培训班关键词排名优化官网
  • 订牛奶网站怎么做信阳seo推广
  • 网站建设包括哪些方面seo是什么意思 为什么要做seo
  • vue如何网站开发做网站企业
  • 做二手手机的网站有哪些媒介
  • 开发微信公众号公司合肥网络seo
  • wordpress怎么升级全国推广优化网站
  • 做网站 图片显示不出来推广软文范文
  • 纺织品做外贸一般在哪个网站上企业网站的优化建议
  • 做我女朋友恶搞网站天津放心站内优化seo