范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

设计模式2策略模式

  做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费
  快速地写出代码
  version_1.cpp #include using namespace std;  class Cash { public:     static double GetTotalPrice(double singlePrice, double total) {         return singlePrice * total;     } };  int main(int argc, char const *argv[]) {     double price = 0, total = 0;     cout << "请输入单价: " << endl;     cin >> price;      cout << "请输入数量: " << endl;     cin >> total;      cout << Cash::GetTotalPrice(price, total);     return 0; }
  现在加需求了,商场促销,全场打八折,满200减100;
  这个没问题,根据简单工厂模式,可以根据不同的活动创建不同的收费类,计算出价格。
  代码如下:
  version_2.cpp #include using namespace std;  class CashSuper { public:     virtual double GetTotalPrice(double singlePrice, double total) {         return singlePrice * total;     } };  class CashNormal : public CashSuper { public:     double GetTotalPrice(double singlePrice, double total) override {         return singlePrice * total;     } };  class CashDiscount : public CashSuper { private:     double discount = 1; public:     CashDiscount(double disc) : discount(disc) {};     double GetTotalPrice(double singlePrice, double total) override {         return singlePrice * total * discount;     } };  class CashReturn : public CashSuper { private:     double moneyCondition = 0;     double moneyReturn = 0; public:     CashReturn() = delete;     CashReturn(double condition, double ret) : moneyCondition(condition), moneyReturn(ret) {};      double GetTotalPrice(double singlePrice, double total) override {         double totalPrice = singlePrice * total;         if (totalPrice > moneyCondition) {             totalPrice = totalPrice - floor(totalPrice / moneyCondition) * moneyReturn;         }         return totalPrice;     } };  class CashFactory { public:     static CashSuper* CreateCash(string& discountStr) {         if (discountStr == "正常收费") {             return new CashNormal;          }         else if (discountStr == "打八折") {             return new CashDiscount(0.8);          }         else if (discountStr == "满200减100") {             return new CashReturn(200, 100);         }         else {             throw;         }     } };  int main(int argc, char const* argv[]) {     double price = 0, total = 0;     int type;     cout << "请输入单价: " << endl;     cin >> price;      cout << "请输入数量: " << endl;     cin >> total;      cout << "请输入收费类型: " << endl         << "1 正常收费, " << endl         << "2 打八折, " << endl         << "3 满200减100." << endl;     cin >> type;      string str;     if (type == 1) {         str.assign("正常收费");      }     else if (type == 2) {         str.assign("打八折");      }     else if (type == 3) {         str.assign("满200减100");      }     else {         cout << "收费类型不对" << endl;     }      CashSuper* cash = CashFactory::CreateCash(str);     cout << cash->GetTotalPrice(price, total);     return 0; }
  简单工厂模式,可以解决问题,以后要加其他的活动,增加新的收费类就行了。
  但是还可以优化,引出今天的策略模式。
  策略模式
  策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到算法的客户.
  商场如何促销, 不管是打折还是返利, 都是算法的不同而已, 用工厂来生成算法, 没问题, 但是算法本身只是一种策略,
  重要的是 这些算法可能随时会互相替换 .
  代码改成策略模式 定义算法家族  也就是上个版本的  CashSuper  基类(策略类), 定义所支持的算法接口( GetTotalPrice ),
  CashNormal , CashDiscount , CashReturn  具体的策略.定义一个context 类, 保存具体的策划类, 实现上下文接口
  version_3.cpp #include using namespace std;  class CashSuper { public:     virtual double GetTotalPrice(double singlePrice, double total) {         return singlePrice * total;     } };  class CashNormal : public CashSuper { public:     double GetTotalPrice(double singlePrice, double total) override {         return singlePrice * total;     } };  class CashDiscount : public CashSuper { private:     double discount = 1; public:     CashDiscount(double disc) : discount(disc) {};     double GetTotalPrice(double singlePrice, double total) override {         return singlePrice * total * discount;     } };  class CashReturn : public CashSuper { private:     double moneyCondition = 0;     double moneyReturn = 0; public:     CashReturn() = delete;     CashReturn(double condition, double ret) : moneyCondition(condition), moneyReturn(ret) {};      double GetTotalPrice(double singlePrice, double total) override {         double totalPrice = singlePrice * total;         if (totalPrice > moneyCondition) {             totalPrice = totalPrice - floor(totalPrice / moneyCondition) * moneyReturn;         }         return totalPrice;     } };  class CashContext { private:     CashSuper* cash; public:     CashContext(string& discountStr) {         if (discountStr == "正常收费") {             cash = new CashNormal;          }         else if (discountStr == "打八折") {             cash = new CashDiscount(0.8);          }         else if (discountStr == "满200减100") {             cash = new CashReturn(200, 100);         }         else {             // 构造函数不建议抛异常             throw;         }     }     double ContextInterface(double price, double total) {         return cash->GetTotalPrice(price, total);     } };  int main(int argc, char const* argv[]) {     double price = 0, total = 0;     int type;     cout << "请输入单价: " << endl;     cin >> price;      cout << "请输入数量: " << endl;     cin >> total;      cout << "请输入收费类型: " << endl         << "1 正常收费, " << endl         << "2 打八折, " << endl         << "3 满200减100." << endl;     cin >> type;      string str;     if (type == 1) {         str.assign("正常收费");      }     else if (type == 2) {         str.assign("打八折");      }     else if (type == 3) {         str.assign("满200减100");      }     else {         cout << "收费类型不对" << endl;     }      CashContext context(str);     cout << context.ContextInterface(price, total);     return 0; }
  从这里我们可以看到, 策略模式这么写, 用的人只需要知道了解  CashContext 类就行了,
  而简单工厂模式则需要认识  CashSuper , CashFactory  两个类.
  策略模式的优点 策略模式定义一系列算法,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合 策略模式的算法基类为Context定义了一系列的可供重用的算法或行为。 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试

7月28日军工无忧!不要一惊一乍,辉哥竖起大旗突出重围今日早盘军工大幅杀跌,有点超出辉哥的预期,但这也是好事!辉哥在15号所说的那三波人,今天应该被彻底清洗下车!辉哥继续维持军工本周必涨,三周内必涨的判断!辉哥继续持仓不动!辉哥希望大7月18日那些小瞧军工的人,七月份注定吃面辉哥就一句话军工本月看涨,下周看涨!辉哥,不是马后炮!辉哥在六月份中旬的时候,就已经明确指出军工这一条赛道有大肉!并且,辉哥知行合一!从六月初就出开始局埋伏,一直到七月初,重仓军工7月25日好多人开始看好军工了,我要交代几句话这两天,我在网上逛了一圈,发现又有好多大v,网红,股神,财经评论员他们又开始看好军工了!所以,我觉得我有必要出来跟大家说几句话俗话说买在分歧,卖在一致。大家都知道我在六月中旬就已经期末复习最抢手搭档MateBookD高颜更高效笔记本电脑已经是大学生们必备的数码产品。因为其在大学生活学习娱乐中起着非常重要的作用。临近岁末,很多大学生准备入手一台新笔记本电脑,一是用来用来复习功课使用,二是准备放假带回家,让5G应用设计揭榜赛决赛开启,京东校园分赛成果展现高校5G技术潜力11月20日,5G应用设计揭榜赛决赛在北京正式开启。作为揭榜赛联合主办单位代表,京东通讯供应链与产品规划部总经理丁玉宽参与了此次决赛评选活动,与现场十余位5G行业技术专家一起观摩了快讯爱立信与TCL结束长达7年的专利纠纷作者黄莺据路透社最新消息,爱立信与TCL之间就智能手机专利许可费率长达数年的专利纠纷已经达成解决方案,双方结束了在加州和德州两地法院的诉讼案件。在加州法庭,TCL宣称爱立信拒绝以合2020年世界100所大学美国专利授权榜中国14所大学,清华第九作者吴征近日,美国国家发明家学会(NAI)和知识产权所有者协会(IPO)联合公布了2020年获得美国授权专利最多的世界100所大学榜单。这一数据是依据美国专利商标局USPTO的数据美国15所顶尖大学欲组建全球第三家汽车专利池作者吴征随着投资疯狂涌入自动驾驶领域,汽车行业的知识产权游戏规则将被怎样颠覆,成为近年来一个热点。2017年,由高通爱立信诺基亚等几家支持成立的Avanci汽车专利池,成为第一个将华为与大众达成迄今为止最大一笔汽车行业专利许可协议中国深圳,2021年7月7日电华为今天宣布,它已与大众集团(VolkswagenGroup)的一家供应商达成了许可协议。该协议包括华为4G标准基本专利(SEPs)下的许可证,该专利中国下决心要彻底解绑SCI和影响因子对中国科研的束缚作者吴征昨天下午,中国政府网发布了国务院办公厅关于完善科技成果评价机制的指导意见(简称指导意见),引起热议。纵观这个文件,可以说全文都在传递一个思想打破既有的科技成果评价体系,建立华为之后,小米也与美国InterDigital达成全球专利和解作者黄莺8月3日,美国InterDigital公司发表声明,宣布与中国小米公司达成和解,双方签署了一份为期多年的全球范围的非独家的专利许可协议。该许可涵盖了InterDigital
微信用户羡慕坏了!QQ手机版再次更新表情包又有新玩法点击右上方关注,第一时间获取科技资讯技能攻略产品体验,私信我回复01,送你一份玩机技能大礼包。6月2日,腾讯QQ在昨天推送安卓8。8。0正式版更新,除了常规的优化体验和提升稳定性外手机行业变天,realme成618最大黑马,10秒超越去年全天2021年可谓是手机行业动荡最大的一年,5G全面普及的大趋势下,各大厂商之间的竞争也愈发激烈。如今也已经是六月,一年一度的618年中大促已经正式开启,对于用户来说是上半年入手新机的预装鸿蒙OS!华为WATCH3系列渲染图曝光MTiaoZhuan(760682)varsNewsID760682varsauthorID1391597今晚2000,期待已经的鸿蒙操作系统及华为全场景新品发布会将正式召开,届时华为又遭重挫,不再与荷兰三大电信商合作5月29日,据外媒报道,荷兰三大运营商KPN沃达丰TMobile均收到荷兰经济部的决定,明确了荷兰对5G网络的要求,即华为将不再参与荷兰5G网络最重要部分的建设。这对华为来说无疑是大众奥迪夹击,特斯拉4月欧洲销量暴跌超九成特斯拉的先发优势已所剩无几,市场正在回归常态文尹路编辑马克5月28日,新能源汽车销量统计网站EVSales发布了2021年4月全欧洲新能源车型销量排名,特斯拉意外跌出前20名。4月三星GalaxyA224G版本支持页面上线预计新机即将到来三星GalaxyA22支持页面已经在俄罗斯三星官方网站上线,页面显示这款手机具体型号为SMA25FDSN,这表明三星很快就会发布GalaxyA22。这款手机被认为有4G和5G版本,5G时代来临!基站辐射大?住在基站下面要不要搬家?真相来了5G这个话题逐渐进入大众的生活当中,5G神秘高科技,对于普通人来说是一个挺新奇的话题。既然新奇,伴随着新奇而来的就是一些误解。有些误解甚至让人坐立难安,比如家附近装了基站会有什么影极氪001未上市就火了,空间悬架四驱无框门,3。8秒破百,28。1万挑战特斯拉特斯拉作为新能源车企的龙头,对本土造车势力带来较大的生存压力,鞭策它们不断向前发展。为了尽快在新能源车型市场占据更多的份额,吉利的高端新能源汽车品牌极氪,于日前亮相首款中大型纯电动旗舰芯片加持硬件拉满仅需799小米FlipbudsPro深度体验此前,高端一直是小米的痛。从2020开始,小米开始发力,实现了逆势增长,这也让冲击高端的战略更加底气十足。TWS耳机领域小米也在很早就已开始布局市场,很快就已站稳市场,以十分亲民的华为官宣!鸿蒙全新独立,贡献者245位,员工跟我们想的不一样刚刚,华为在心声社区发布一则由华为轮值董事长徐直军签发的,关于规范HarmonyOS(鸿蒙)沟通口径的通知。通知内容显示,关于鸿蒙操作系统,由于内部理解不一致对外说法不一致,容易引华为鸿蒙首发体验当有一套系统,可以连接所有硬件智东西(公众号zhidxcom)作者云鹏编辑漠影这周华为发布的HarmonyOS2(也就是大家所知的鸿蒙操作系统),像一枚核弹,引爆了2021上半年相对沉寂的科技圈。一时间,Har