自己做网站需要买哪些东西,登记注册身份验证,仿淘宝网站源码 php,wordpress 添加视频定义
定义一些列算法#xff0c;把他们一个个封装起来#xff0c;并且使他们可以相互替换#xff08;变化#xff09;。该模式使得算法可独立于使用它的客户程序#xff08;稳定#xff09;而变化#xff08;扩展、子类化#xff09;。
C实现
在不考虑策略模式的情况…定义
定义一些列算法把他们一个个封装起来并且使他们可以相互替换变化。该模式使得算法可独立于使用它的客户程序稳定而变化扩展、子类化。
C实现
在不考虑策略模式的情况下我们往往会写出以下代码
class CompressData {
public:void compress(const char* stg_name, char* data, int size) {if (strcmp(stg_name, lz4) 0) {// lz4算法实现数据压缩} else if (strcmp(stg_name, zlib) 0) {// zlib算法实现数据压缩} else {// 未知算法不支持}}
};可以看出如果我需要新增一个gzip压缩算法那么我就需要在代码中新增一段实现gzip算法的代码。这明显违背了开放封闭原则。因此考虑使用策略模式代码实现如下
class Strategy {
public:virtual void compress(char* data, int size) 0;virtual ~Strategy() {}
};class Lz4Strategy : public Strategy {
public:void compress(char* data, int size) {// Lz4压缩算法实现}
};class ZlibStrategy : public Strategy {
public:void compress(char* data, int size){// zlib压缩算法实现}
};class GzipStrategy : public Strategy {
public:void compress(char* data, int size){// Gzip压缩算法实现}
};上述代码表明为每个策略单独创建一个类这样在新增策略时就只需要进行扩展即可。再来看CompressData类上下文程序如何实现。
class CompressData{
private:Strategy* _stg;
public:CompressData(StrategyFactory* factory){_stg factory-createStrategy();}void compress(char* data, int size){_stg-compress(data, size);}~CompressData(){delete _stg;}
};这里会用到工厂方法模式客户程序在选择使用何中压缩算法时是根据传入的工厂来决定的。到这里我们可以看出来新增一个压缩策略只需要扩展一个对应的压缩算法类即可并不需要修改上下文程序。
类图 其中Context就是上下文程序是稳定的所有具体的策略都继承自抽象的策略是变化的。因此新增策略只需要对代码进行扩展即可。
总结
Strategy及其子类为组件提供了一系列可重用的算法使得类型在运行时方便的根据需要在各算法之间切换。策略模式消除了条件判断语句含有许多条件判断的语句往往可以使用策略模式来解耦合。如果Strategy对象没有数据成员那么各个上下文之间可以共享同一个Strategy对象从而节省对象开销。