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

中国智慧团建网站厦门网站优化服务

中国智慧团建网站,厦门网站优化服务,城乡与住房建设厅网站,陈村大良网站建设定义 定义一系列算法#xff0c;把它们一个个封装起来#xff0c;并且使他们可互相替换#xff08;变化#xff09;。该模式使算法可独立于使用它的客户程序#xff08;稳定#xff09;而变化#xff08;拓展#xff0c;子类化#xff09;。 动机#xff08;Motiva…定义 定义一系列算法把它们一个个封装起来并且使他们可互相替换变化。该模式使算法可独立于使用它的客户程序稳定而变化拓展子类化。 动机Motivation 在软件构建过程中某些对象使用的算法可能多种多样经常改变如果将这些算法都编码到对象中将会使对象变得异常复杂而且有时候支持不使用的算法也是一个性能负担。 例如在电子商务中的一个税种订单计算。我们首先想到的实现方法是先定义一个枚举类型定义出中国美国德国的税法计算。 在涉及到税法计算中 CalculateTax 我们通过这个枚举类型进行相应的计算。 enum TaxBase {CN_Tax, // 中国US_Tax, // 美国DE_Tax, // 德国 };class SalesOrder{TaxBase tax; public:double CalculateTax(){//...if (tax CN_Tax){//CN***********}else if (tax US_Tax){//US***********}else if (tax DE_Tax){//DE***********} //....}}; 比方说 未来出现变化了需要支持 法国的税法。 首先需要在枚举类型 TaxBase 中增加一个枚举类型 FR_Tax //法国 然后再 CalculateTax 中继续添加 if (tax FR_Tax) 完整代码如下 enum TaxBase {CN_Tax,US_Tax,DE_Tax,FR_Tax //更改 };class SalesOrder{TaxBase tax; public:double CalculateTax(){//...if (tax CN_Tax){//CN***********}else if (tax US_Tax){//US***********}else if (tax DE_Tax){//DE***********}else if (tax FR_Tax){ //更改//...}//....}}; 很显然上面的代码违反了 开放封闭原则即对拓展开发对更改封闭。就是类模块尽可能用拓展的方式来支持未来的变化而不是直接修改源代码。 下面开始改进 首先不使用枚举类型 而是定义一个税法策略的基类 它有一个计算的方法 Calculate是纯虚函数 class TaxStrategy{ public:virtual double Calculate(const Context context)0;virtual ~TaxStrategy(){} };2.对于各个国家的税法我们进行单独的计算其实就是将 if (tax CN_Tax){//CN***********}类似这部分 CN … US … 等这类算法部分 放到类的纯虚函数中,变成 TaxStrategy 的子类。 class CNTax : public TaxStrategy{ public:virtual double Calculate(const Context context){//***********} };class USTax : public TaxStrategy{ public:virtual double Calculate(const Context context){//***********} };class DETax : public TaxStrategy{ public:virtual double Calculate(const Context context){//***********} };创建多态指针 TaxStrategy * strategy 这里使用的是外界传入的这里可能返回的是 DETax 或 USTax 或 CNTax 等的对象至于是哪一个由工厂模式确定在 SalesOrder(StrategyFactory* strategyFactory) 中的函数参数传入。如果传入是 USTax 那么就是美国。 首先构建算法上下文 Context context(); 然后直接调用 strategy-Calculate(context); 这就是一个多态调用可能会调用 中国税法也可能调用美国或其它。从时间轴看好处。加入增加一个法国的税计算那么只需要增加 class FRTax : public TaxStrategy{ public: virtual double Calculate(const Context context){ //*********** } }; 然后其他的代码就不需要改变。 完整代码如下 class SalesOrder{ private:// 这里期望这个指针指向不同的strategy的子类TaxStrategy* strategy;public:SalesOrder(StrategyFactory* strategyFactory){// 实例化一个对象this-strategy strategyFactory-NewStrategy();}~SalesOrder(){delete this-strategy;}public double CalculateTax(){//...Context context();double val strategy-Calculate(context); //多态调用//...}};class TaxStrategy{ public:virtual double Calculate(const Context context)0;virtual ~TaxStrategy(){} };class CNTax : public TaxStrategy{ public:virtual double Calculate(const Context context){//***********} };class USTax : public TaxStrategy{ public:virtual double Calculate(const Context context){//***********} };class DETax : public TaxStrategy{ public:virtual double Calculate(const Context context){//***********} };//扩展 //********************************* class FRTax : public TaxStrategy{ public:virtual double Calculate(const Context context){//.........} };class SalesOrder{ private:// 这里期望这个指针指向不同的strategy的子类TaxStrategy* strategy;public:SalesOrder(StrategyFactory* strategyFactory){// 实例化一个对象this-strategy strategyFactory-NewStrategy();}~SalesOrder(){delete this-strategy;}public double CalculateTax(){//...Context context();double val strategy-Calculate(context); //多态调用//...}}; 总结 Strategy 及其子类为组件提供了一系列可重用的算法从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。 Strategy 模式提供了用条件判断语句之外的另一种选择消除条件判断语句就是在解耦合。含有许多条件判断语句的代码通常都需要 Strategy 模式。 如果 Strategy 对象没有实例变量那么各个上传下文可以共享同一个 Strategy 对象从而节省对象开销。
http://www.zqtcl.cn/news/559183/

相关文章:

  • 网站建设费用摊销会计分录合肥网站建设哪里好
  • 郑州市建设工程造价信息网站关于工程项目建设的网站
  • 网站做淘宝客收入咋样景区门户网站建设方案
  • 遵义做网站推广西安都有哪些公司
  • 万网建网站流程产品展示网站模板php
  • 新津县建设局网站网站做301
  • 网站域名续费如何建设一个简易网站
  • 网站整体迁移该怎么做wordpress 图片调用api接口
  • 网站获得流量最好的方法是什么 ( )汕头建设学校的网站
  • 网上下载的网站后台安全吗仿系统之家网站源码
  • 网站实名审核高等教材电工学久久建筑网
  • 化学试剂购买网站网站节点加速
  • 桂林城乡建设局网站在线咨询免费
  • 长治网站设计制作网站ps怎么做网站导航内嵌式
  • 网站 橙色前台网站开发
  • 滨海网站建设服务商电子商务网站建设与维护pdf
  • 企业网站建设方案效果h5网页制作app
  • 国内搜索引擎网站免费无线
  • 龙岩做网站价格室内建筑设计
  • 闲鱼上面给人做网站造退款微信登录建设银行网站
  • 无锡网站推广公司网络营销课程设置
  • dede 网站根目录北京好的设计公司
  • 网站关键词重复wordpress 影响力
  • 外包商网站怎么做php网站转移
  • 怎么做自己的网站推广产品企业建站 平台
  • 河北做网站公司网站建设团队扬州
  • 114物流网站怎么做免费注册163免费邮箱申请
  • 做网站要以单位手机发博客wordpress
  • 莆田网站建设莆田seo管理系统培训
  • 有一个网站自己做链接获取朋友位置网站关键词数量减少