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

保康网站建设福建网站制作公司

保康网站建设,福建网站制作公司,seo在线培训,wordpress 虎嗅网有一个广告召回系统#xff0c;输入用户id就可以给用户推荐相应的广告#xff0c;一开始我们只有布尔检索和向量检索两种方式。 1. 面向接口编程#xff0c;而非实现 第一点就是定义接口#xff0c;客户端关注的是接口#xff0c;对客户端来说#xff0c;他只关心检索引…有一个广告召回系统输入用户id就可以给用户推荐相应的广告一开始我们只有布尔检索和向量检索两种方式。 1. 面向接口编程而非实现 第一点就是定义接口客户端关注的是接口对客户端来说他只关心检索引擎提供出来的接口是什么样子不在意检索引擎是如何实现的。所以第一点就是抽象出接口。 class Recall { public:virtual ~Recall() default;virtual void recall(std::string uid) 0; };2. 实现接口 我们有两个检索引擎一个倒排一个向量根据接口分别实现这两种召回 // 倒排检索 class InvertRecall : public Recall {void recall(std::string uid) override {std::cout uid : invert recall\n;} };// 向量检索 class VectorRecall : public Recall {void recall(std::string uid) override {std::cout uid : vector recall\n;} };3. 客户端调用 我们给客户端提供了两种召回方式客户端其实并不关心的他只关心接口是什么通过这个接口他就可以拿到自己想要的结果 Recall* vectorRecall new InvertRecall(); // 倒排召回 Recall* invertRecall new VectorRecall(); // 向量召回 invertRecall-recall(uid); vectorRecall-recall(uid); 我特意把名字写反了就是为了表示客户端其实并不关心具体的召回方式是什么谁来都一样他只关心recall接口根据recall接口就可以得到自己想要的结果我们在改进一下 class AggRecall { private:std::vectorstd::shared_ptrRecall m_recall; public:void addRecall(const std::shared_ptrRecall recall) {m_recall.emplace_back(recall);}void recall(std::string uid) {for (auto recall: m_recall) {recall-recall(uid);}} };4. 新增了三方接口 除了我们自己实现的两种召回方式还有一些其他的三方召回方式。当然人家也很专业也是面向接口编程同时提供了一种实现方案。 // 三方代码勿动以so方式提供 class ThirdPartyRecall { public:virtual ~ThirdPartyRecall() default;virtual void process(std::string uid, std::string thirdParty) 0; };class ThirdPartyRecallImp : public ThirdPartyRecall { public:void process(std::string uid, std::string thirdParty) override {std::cout thirdParty recall std::endl;} };这个时候客户端实现的AggRecall方案就要发生一些变化了因此三方的接口名字和参数和我们实现的召回接口不一样一种想当然的方式就是把所有召回引擎的接口统一大家都叫recall或者大家都叫process。 5. 统一接口 三方的召回接口是以so的方式提供的我们想要修改代码也不现实了一种愚蠢的方法就是修改自己的recall接口但是你有没有想过如果又有一个其他三方接口不一致怎么办呢 // 三方代码勿动以so方式提供 class GoogleRecall { public:virtual ~GoogleRecall() default;virtual void search(std::string uid) 0; };class GoogleRecallImp : public GoogleRecall { public:void search(std::string uid) override {std::cout uid : google search std::endl;} };6. 适配器 现在的问题就是如何把这些接口统一了其实很简单我们把三方的接口包一层不久可以了吗或者说重命名不就可以了吗 class ThirdPartyAdapter : public Recall { private:std::shared_ptrThirdPartyRecallImp thirdPartyRecall; public:explicit ThirdPartyAdapter(std::shared_ptrThirdPartyRecallImp recall) : thirdPartyRecall(std::move(recall)) {}void recall(std::string uid) override {thirdPartyRecall-process(uid, baidu);} }; 同样可以对其他的三方接口进行转换 class GoogleAdapter : public Recall { private:std::shared_ptrGoogleRecallImp googleRecall; public:explicit ThirdPartyAdapter(std::shared_ptrGoogleRecallImp recall) : googleRecall(std::move(recall)) {}void search(std::string uid) override {googleRecall-search(uid);} };就是这么简单我们把process函数用一个recall函数包装起来这样客户端在调用的时候依然调用的是recall函数而且也继承了Recall接口 int main() {auto invertRecall std::make_sharedInvertRecall();auto vectorRecall std::make_sharedVectorRecall();auto thirdRecall std::make_sharedThirdPartyRecallImp();auto googleRecall std::make_sharedThirdPartyAdapter(thirdRecall);auto aggRecall std::make_sharedAggRecall();aggRecall-addRecall(invertRecall);aggRecall-addRecall(vectorRecall);aggRecall-addRecall(googleRecall);aggRecall-doRecall(); }这个呢就叫适配器把其他接口转换成我们想要的接口。
http://www.dnsts.com.cn/news/74416.html

相关文章:

  • 网上有兼职做数据网站jsp网站
  • 临夏州住房和城乡建设厅网站海南网络推广评估
  • 苏州做网站专业的公司wordpress远程下载图片
  • 水果网站建设规划书微信订阅号关键网站
  • 东莞公司网站价格百度推广seo效果怎么样
  • 建设企业网站下载做网站如何让盈利
  • 手机公众平台网站开发注册个网站怎么注册
  • 平凉网站建设平凉外包公司和正式员工待遇
  • 国内搜索网站排名西宁网站公司
  • 自己弄个网站推荐聊城做网站
  • 技术支持 盈岚网站建设网站安全维护方案
  • iapp网站做软件教程jsp网站 值班功能
  • 商务网站建设摘要保定网站建设多少钱
  • 网站建设如何加入字体做电影网站违法吗
  • 网站运营名词解释网址升级中 请稍后访问
  • 网站提交订单付款才跳转怎么做电子商务网站建设编码
  • 平面设计软件哪个好中山网站优化排名
  • 怎么在百度上建网站律师所网站建设
  • 电子商务软件网站建设的核心网站 多少篇文章才能上线
  • 网站建设的针对对象福田汽车公司
  • cmseasy做网站简单吗wordpress 模板加密
  • 福州网站建设liedns域名建设好了怎么在建设网站
  • 全国哪几家做5G网站公司5G网站建设要多少个
  • 怎么查看网站域名雄安网站制作多少钱
  • wordpress um插件郑州搜索引擎优化公司
  • 什么样的网站不备案wordpress的登录
  • 网站开发亿玛酷适合5外国英文设计网站
  • 自己做的网站怎么维护网站如何做视频点播
  • 二次网站开发做代售机票网站程序
  • 一个网站可以做多少个关键词网站和网页的目的