admin管理员组文章数量:1566622
声明:本博文篇幅短,适合review。
一、概念
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
二、模式结构图
class Strategy
{
public:
Strategy();
virtual ~Strategy();
virtual void algrithmInterface() = 0;
};
class ConcreteStrategyA : public Strategy
{
public:
ConcreteStrategyA();
~ConcreteStrategyA();
void algrithmInterface(){
cout<<" ConcreteStrategyA algrithmInterface"<<endl;
}
};
class ConcreteStrategyB : public Strategy
{
public:
ConcreteStrategyB();
~ConcreteStrategyB();
void algrithmInterface(){
cout<<" ConcreteStrategyB algrithmInterface"<<endl;
}
};
class Context
{
public:
Context(Strategy * stg){
mStg = stg;
}
~Context(){
if (!mStg){
delete mStg;
}
}
void contextInterface(){
mStg->algrithmInterface();
}
private:
Strategy * mStg;
};
void main(){
Strategy * stgA = new ConcreteStrategyA();
Context * ct = new Context(stgA);
ct->contextInterface();
}
三、例子
class IMGFormat
{
public:
IMGFormat();
virtual ~IMGFormat();
virtual void formatImage() = 0;
};
class FormatPNG : public IMGFormat
{
public:
FormatPNG();
~FormatPNG();
void formatImage(){
cout<<" FormatPNG formatImage"<<endl;
}
};
class FormatJPG : public IMGFormat
{
public:
FormatJPG();
~FormatJPG();
void formatImage(){
cout<<" FormatJPG formatImage"<<endl;
}
};
class FormatTool
{
public:
FormatTool(IMGFormat * fmt){
mFmt = fmt;
}
~FormatTool(){
if (!mFmt){
delete mFmt;
}
}
void format(){
mFmt->formatImage();
}
private:
IMGFormat * mFmt;
};
void main(){
FormatTool * ftPNG = new FormatTool(new FormatPNG());
ftPNG->format();
FormatTool * ftJPG = new FormatTool(new FormatJPG());
ftJPG->format();
delete ftPNG;
delete ftJPG;
}
四、优缺点
Strategy 通过“组合”(委托)方式实现算法 (实现)的异构,而 Template 模式则采取的是继承的方式
1、优点
a、提高了代码复用性。
b、使用组合替代继承,可以在运行时决定算法。
c、使用策略模式可以避免使用多重条件转移语句。
2、缺点
a、要使用策略模式,必须了解所有的strategy,必须了解各个strategy之间的不同点。
b、策略模式造成很多的策略类,每个具体策略类都会产生一个新类。
版权声明:本文标题:Strategy(策略)设计模式 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1725702039a1037588.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论