一、前言

  学习的第一个设计模式!不知道理解的对不对,期望大家一起多交流~

  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模式的更多相关文章

  1. android 开发设计模式---Strategy模式

    假设我们要出去旅游,而去旅游出行的方式有很多,有步行,有坐火车,有坐飞机等等.而如果不使用任何模式,我们的代码可能就是这样子的. 12345678910111213141516171819202122 ...

  2. Groovy 设计模式 -- Strategy 模式

    策略模式 https://en.wikipedia.org/wiki/Strategy_pattern In computer programming, the strategy pattern (a ...

  3. 设计模式-策略模式(Strategy Model)

    1.概述     在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能.     如在人物比较排序的实现中,我们有 ...

  4. 策略模式设计模式(Strategy)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将 ...

  5. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  6. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  7. 设计模式之——浅谈strategy模式(策略模式)

    strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...

  8. 设计模式(十)Strategy模式

    Strategy模式,就是用来整体地替换算法,可以轻松地以不同的算法解决同一个问题. 还是根据一个示例程序来理解这种设计模式吧.先看一下示例程序的类图. 然后看示例程序代码. package bigj ...

  9. C++设计模式-Strategy策略模式

    Strategy策略模式作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: Strategy模式将逻辑(算法)封装到一个类(Cont ...

随机推荐

  1. C语音指针Introduction.

    指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构: 能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序 ...

  2. ansible 学习与实践

    title: ansible 学习与实践 date: 2016-05-06 16:17:28 tags: --- ansible 学习与实践 一 介绍 ansible是新出现的运维工具是基于Pytho ...

  3. .net对文件的操作之对文件目录的操作

    .NET 提供一个静态File类用于文件的操作,下面列出它的主要操作方法. 返回值类型 方法名称 说明 bool Exists(string path) 用于检查指定文件是否存在 void Copy( ...

  4. django: template - built-in tags

    本节介绍模板中的内置标签:if for 承上文,修改 views.py 如下: from django.shortcuts import render_to_response class Person ...

  5. NHIBERNATE之映射文件配置说明(转载4)

    二十.自定义值类型   开发者创建属于他们自己的值类型也是很容易的.比如说,你可能希望持久化Int64类型的属性, 持久化成为VARCHAR 字段.NHibernate没有内置这样一种类型.自定义类型 ...

  6. java下载文件

    /** * * @param file * @param response */ private void downLoad(File file, HttpServletResponse respon ...

  7. java读取网页

    package cn.stat.p4.ipdemo; import java.io.IOException; import java.io.InputStreamReader; import java ...

  8. UVA 10037 贪心算法

    题目链接:http://acm.hust.edu.cn/vjudge/contest/122829#problem/A 题目大意:N个人夜里过河,总共只有一盏灯,每次最多过两个人,然后需要有人将灯送回 ...

  9. 16--Box2D使用(二、显示物理世界)

    在上一篇文章中我们创建了的一个物理世界,当物理世界中的刚体一个也没有显示出来.为显示物理世界中的物体,我们需要引入GLES-Render(调试Box2D使用).这两个文件可以再 %Cocos_Home ...

  10. Hadoop学习历程(三、第一个程序)

    根据之前的操作,我们已经可以正常的启动Hadoop了,关于真正的集群我会在之后进行说明.现在我们来看一下第一个程序吧 1. 在eclipse上建立一个java项目 2. 将 /usr/hadoop/s ...