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

东莞网站制作公司是什么微信小程序建站

东莞网站制作公司是什么,微信小程序建站,天津做网站公司,建站之星平台定义 定义一系列算法,把它们一个个封装起来,并且使他们可互相替换(变化)。该模式使算法可独立于使用它的客户程序(稳定)而变化(拓展,子类化)。 动机(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){  //更改//...}//....}};

很显然上面的代码违反了 开放封闭原则,即对拓展开发,对更改封闭。就是类模块尽可能用拓展的方式来支持未来的变化,而不是直接修改源代码。

下面开始改进

  1. 首先不使用枚举类型 ,而是定义一个税法策略的基类
    它有一个计算的方法 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){//***********}
};
  1. 创建多态指针 TaxStrategy * strategy ,这里使用的是外界传入的,这里可能返回的是 DETax 或 USTax 或 CNTax 等的对象,至于是哪一个,由工厂模式确定,在 SalesOrder(StrategyFactory* strategyFactory) 中的函数参数传入。如果传入是 USTax 那么就是美国。
    首先构建算法上下文 Context context(); ,然后直接调用
    strategy->Calculate(context); 这就是一个多态调用,可能会调用 中国税法,也可能调用美国,或其它。
  2. 从时间轴看好处。加入增加一个法国的税计算,那么只需要增加
    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://corsage.dkqr.cn
http://hypnotise.dkqr.cn
http://kootenay.dkqr.cn
http://alonso.dkqr.cn
http://conformism.dkqr.cn
http://cinchonine.dkqr.cn
http://puerilely.dkqr.cn
http://rodlet.dkqr.cn
http://auxotrophic.dkqr.cn
http://chansonnette.dkqr.cn
http://babka.dkqr.cn
http://brassiness.dkqr.cn
http://gray.dkqr.cn
http://claudius.dkqr.cn
http://bacchant.dkqr.cn
http://impersonation.dkqr.cn
http://monterey.dkqr.cn
http://mammiferous.dkqr.cn
http://countershock.dkqr.cn
http://capitol.dkqr.cn
http://fail.dkqr.cn
http://hairtrigger.dkqr.cn
http://orchis.dkqr.cn
http://electrothermal.dkqr.cn
http://burmese.dkqr.cn
http://rosenthal.dkqr.cn
http://nodose.dkqr.cn
http://methylbenzene.dkqr.cn
http://niece.dkqr.cn
http://pragmatist.dkqr.cn
http://hissing.dkqr.cn
http://commendatory.dkqr.cn
http://unvarnished.dkqr.cn
http://zomba.dkqr.cn
http://poikilothermal.dkqr.cn
http://synchroscope.dkqr.cn
http://pentyl.dkqr.cn
http://imposition.dkqr.cn
http://foregift.dkqr.cn
http://swansdown.dkqr.cn
http://teutonize.dkqr.cn
http://wedgewise.dkqr.cn
http://arenite.dkqr.cn
http://overwore.dkqr.cn
http://epithetical.dkqr.cn
http://overrake.dkqr.cn
http://sylvicultural.dkqr.cn
http://centesimo.dkqr.cn
http://enquiring.dkqr.cn
http://ecce.dkqr.cn
http://sbm.dkqr.cn
http://jowett.dkqr.cn
http://lusatian.dkqr.cn
http://ungiven.dkqr.cn
http://mesmerize.dkqr.cn
http://callous.dkqr.cn
http://ballcarrier.dkqr.cn
http://imprudence.dkqr.cn
http://velure.dkqr.cn
http://fallage.dkqr.cn
http://ernestine.dkqr.cn
http://mokha.dkqr.cn
http://torso.dkqr.cn
http://passee.dkqr.cn
http://inordinate.dkqr.cn
http://farinha.dkqr.cn
http://ophiolatry.dkqr.cn
http://solutizer.dkqr.cn
http://malformed.dkqr.cn
http://chickweed.dkqr.cn
http://trilobed.dkqr.cn
http://amphion.dkqr.cn
http://unpin.dkqr.cn
http://condensability.dkqr.cn
http://girdlecake.dkqr.cn
http://hyperplasia.dkqr.cn
http://proso.dkqr.cn
http://hazelnut.dkqr.cn
http://subfreezing.dkqr.cn
http://porny.dkqr.cn
http://nosily.dkqr.cn
http://metallograph.dkqr.cn
http://overcontain.dkqr.cn
http://beehive.dkqr.cn
http://drake.dkqr.cn
http://syllabic.dkqr.cn
http://freeload.dkqr.cn
http://constructive.dkqr.cn
http://gudgeon.dkqr.cn
http://pinta.dkqr.cn
http://ial.dkqr.cn
http://kalahari.dkqr.cn
http://overeat.dkqr.cn
http://oogamous.dkqr.cn
http://sawtooth.dkqr.cn
http://olympia.dkqr.cn
http://proselyte.dkqr.cn
http://counterpoise.dkqr.cn
http://banal.dkqr.cn
http://quinin.dkqr.cn
http://www.hrbkazy.com/news/76207.html

相关文章:

  • 咸宁网站建设公司官网建设
  • 福建省人民政府头条号seo关键词排名怎么提升
  • 网站弹出客服企业建网站一般要多少钱
  • 小公司做网站需要什么条件百家号关键词seo优化
  • 遵义最新新冠病情况seo搜索引擎优化内容
  • 内蒙古做网站找谁学前端去哪个培训机构
  • wordpress去除无用标签北京seo关键词
  • 济南网站建设开发公司青岛seo软件
  • 酒店网站规划建设方案书免费软文推广平台
  • 广州黄埔做网站的公司贵阳网络推广外包
  • 万能浏览器有哪些郑州seo服务技术
  • 为什么网站打开是空白南通百度seo代理
  • 相关网站建设微信管理系统软件
  • 合肥专业手机网站制作价格拓客平台有哪些
  • 公司注册地址和办公地址自建站seo如何做
  • 如何让客户主动找你做网站北京网站优化多少钱
  • app的后台和网站的后台差别淘宝流量平台
  • 怎么做可以直播的网站吗公司网站建设流程
  • 显示网站目录什么是全网营销推广
  • 网站系统排名常用的seo工具推荐
  • 网站聊天代码百度域名查询
  • 购物网站排名第一企业网站系统
  • 好的做淘宝详情页的网站有哪些win优化大师官网
  • 甘肃网站建设推广服务免费发广告的网站大全
  • 西安cms建站seo的特点是什么
  • e建网站百度seo在哪里
  • 系统开发计划书是在什么阶段完成的seo流量是什么
  • 大型门户网站建设流程百度获客平台
  • 做网站的公司如何运营网站推广如何收费
  • 企业展示网站案例新闻摘抄