首页 > 代码库 > C++设计模式---Strategy模式
C++设计模式---Strategy模式
一、前言
学习的第一个设计模式!不知道理解的对不对,期望大家一起多交流~
Strategy模式:策略模式,定义了算法族,分别封装起来,此模式可以让算法的变化独立于使用算法的客户。Strategy模式将逻辑算法封装到一个类中,通过组合的方式将具体的算法实现在组合对象中,再通过委托的方式将抽象的接口的实现委托给组合对象实现。其模型结构图如下:
二、Strategy策略实例
最近在写遥感影像融合相关算法,PCA、Brovey和SFIM算法,正好可以用于这次学习Strategy策略。
关于这三个融合算法都属于替换类算法,大概思路就是用一个替换另外一个。然后获得高分辨的高频信息和地分辨的光谱信息。
依据Strategy策略的思想,我们首先定义一个CContextFusion类,里面有一个DoFusionAction()方法,主要用于实现算法逻辑抽象接口,其头文件如下:
#pragma once#include "StrategyFusion.h"class CStrategyFusion;class CContextFusion{public: CContextFusion(CStrategyFusion *stg); ~CContextFusion(void); bool DoFusionAction();private: CStrategyFusion *m_stg;};
cpp文件如下:
#include "ContextFusion.h"CContextFusion::CContextFusion( CStrategyFusion *stg ){ m_stg = stg;}CContextFusion::~CContextFusion(void){ if(!m_stg) delete m_stg;}bool CContextFusion::DoFusionAction(){ return m_stg->runFusion();}
完成这个类后,我们首先定义一个融合算法超类CStrategyFusion,考虑到以上三种算法都要实现影像的重采样和增益系数的计算。为此,我们把这两个方法的实现放在超类中,对于其他与融合算法相关的方法,放到具体的算法类中。其类结构关系如下所示:
头文件分别如下:
#pragma once#include <iostream>#include <string>#include <omp.h>#include <gdal_alg_priv.h>class CStrategyFusion{public: CStrategyFusion(void); virtual ~CStrategyFusion(void); virtual bool runFusion() = 0;protected: int ReSampleMSSToPAN(); void getGAIN(); std::string m_panFileName; std::string m_mssFileName; std::string m_resampleFileName; std::string m_FusionFileName; GDALDataType m_dt; int m_resampleModel; int m_gainX; // X方向增益像元个数 int m_gainY; // Y方向增益像元个数 int m_FusionWidth; // 融合后影像宽 int m_FusionHeight; // 融合后影像高 double m_FusionGeoTransform[6];//private:};
#pragma once#include "strategyfusion.h"class CStrategyFusionByPCA : public CStrategyFusion{public: CStrategyFusionByPCA(void); ~CStrategyFusionByPCA(void); bool runFusion();private: double *calMSSMean(); double *calCovMaxtrix(double *bandMean); bool eejcb(double a[],int n,double v[],double eps,int jt); void sortEigenVector( int iBandCount,double * eigenVector,double * covAfterEejcb); void PCATransform(double *eigenVector); double* cdf(int *h,int length); void matchHistogram(); void inverseMatrix( double *matrix, int n ); void invertPCA(double * eigenVector); std::string m_PCAFileName; std::string m_PanNewFileName;};
#pragma once#include "strategyfusion.h"class CStrategyFusionByBrovey : public CStrategyFusion{public: CStrategyFusionByBrovey(void); ~CStrategyFusionByBrovey(void); bool runFusion();private: bool CNByBrovery();};
#pragma once#include "strategyfusion.h"class CStrategyFusionBySFIM : public CStrategyFusion{public: CStrategyFusionBySFIM(void); ~CStrategyFusionBySFIM(void); bool runFusion();private: bool FilterMeanByPan(); bool SFIM();};
总结:通过Strategy策略,我们可以自由、方便的补充新的基于替换类的融合算法,甚至其他所有的融合算法,换句话说就是可以自由定制自己的融合算法类,这种基于接口的实现不会因为继承而导致不可预计的危险。
C++设计模式---Strategy模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。