欢迎大家来到IT世界,在知识的湖畔探索吧!
“组件协作” 模式:
现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
典型模式
- Template Method
- Strategy
- Observer/Event
策略模式
动机(Motivation)
在软件构建过程,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不适用的算法也是一个性能负担。
如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?
定义一系列算法,把他们一个个封装起来,并且使他们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。
—-《设计模式》GoF
要看出来哪些是变化的,哪些是稳定的
//strategy1.cpp
//税种计算
enum TaxBase
{
CN_Tax,
US_Tax,
DE_Tax,
FR_Tax,//更改 违背了开闭原则,对修改关闭,对扩展开放
};
//初看没有问题。
//要动态的看问题,要有时间轴的概念,考虑到问题以后变化的时候,添加日本、韩国等
class SalesOrder
{
TaxBase tax;
public:
double CalulateTax()
{
//...
if (tax == CN_Tax)
{
//CN
}
else if (tax == US_Tax)
{
//US
}
else if (tax == DE_Tax)
{
//DE
}
//在后面添加代码,往往会打破原有代码,复用是指的二进制层面的
//不是代码层面的,
else if (tax == FR_Tax)//更改
{
//RF
}
//...
}
};
欢迎大家来到IT世界,在知识的湖畔探索吧!
欢迎大家来到IT世界,在知识的湖畔探索吧!//strategy2.cpp
//税法策略基类
class TaxStrategy
{
public:
virtual double Calculate(const Context& context) = 0;
//C++里面任何一个基类都要写成虚的析构函数
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)
{
//******
}
};
//扩展---单独编译成dll加进来。遵循了开闭原则,
// 我们讲的复用性指的是二进制意义的复用性,部署之后就不会动。
//**************************************
class FRTax : public TaxStrategy
{
public:
virtual double CalculateTax(const Context& context)
{
//******
}
};
//销售订单
class SalesOrder
{
private:
//必须刚一个指针,不能放一个对象,极少放TaxStrategy& 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);
//...
}
};
TaxStrategy类内一般只放置一个方法。
SalesOrder类、TaxStrategy类 为稳定部分
CNTax类 USTax类 DETax类为变化部分
要点总结:
Strategy 及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。
运行时:支持各个算法之间的切换。
Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
当你的代码中出现if else if或者Swich Case时,就是需要Strategy的一种特征。
如果后期有扩展变化,就是典型的Strategy。只有在if else绝对不变时则不需要Strategy。如:一周有7天,不可能变。是觉得稳定不变的,可以使用if else。
看到if else 就要相当小心,就应该很敏感的想到Strategy设计模式。百分之8910的清空是需要Strategy设计模式。
顺带解决:
if else 代码:装到中国,其他部分就不需要,但是已经加载到内存中了,这里面就有性能负担。
Strategy模式:使用多态则代码只有调用的时候才加载到内存,具有良好的本地性。
如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销
Strategy 从某种层面上来说可以使用后面要讲的Signal来设计的。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/31662.html