利用策略与工厂模式构建的闭源功能模型库,如何进行快捷的功能扩展与完善?

jznudt 2016-04-19 09:38:47
加精
利用策略与工厂模式,构建了某闭源的功能模型库,主要用于无人飞行器上的自主寻的制导。现将骨干程序抽离如下:首先定义了导引律接口(Interface),在C++中采用了纯虚函数来实现,然后采用公有继承的方法,实现了三种典型的导引律,包括:比例导引律(PN)、修正比例导引律(APN)和追踪法导引律(TPN)。相关代码如下图所示:
//导引律枚举
enum HOMINGLAW
{
PN, //比例导引律
APN, //修正比例导引律
TPN, //追踪法导引律
}

class GuidanceLaw
{
public:
GuidanceLaw();
virtual ~GuidanceLaw();

public:
virtual BOOL Initialize() = 0;
virtual void Advance() = 0;

//其它代码
…………
};

class PNGuidanceLaw : public GuidanceLaw
{

//具体实现
BOOL Initialize();
void Advance();
};

class APNGuidanceLaw : public GuidanceLaw
{
//具体实现
BOOL Initialize();
void Advance();
};

class TPNGuidanceLaw : public GuidanceLaw
{
//具体实现
BOOL Initialize();
void Advance();
};

在实现了上述三种典型的导引律基础上,采用策略与简单工厂模式,完成了自主寻的制导功能模型的开发,概述如下:
class Guidance
{
public:
Guidance() : pGuidanceLaw(NULL)
{

}

Guidance(HOMINGLAW law)
{
switch(law)
{
case PN:
pGuidanceLaw = new PNGuidanceLaw;
break;

case APN:
pGuidanceLaw = new APNGuidanceLaw;
break;

case TPN;
pGuidanceLaw = new TPNGuidanceLaw;
break;

default:
pGuidanceLaw = new PNGuidanceLaw; //默认采用比例导引律
break;
}
}

virtual ~Guidance();

//其它操作代码
…………

protected:
GuidanceLaw* pGuidanceLaw;

…………
};

在实际使用上述闭源模型过程中,用户提出需要新增一至两种导引律(也就是要增加GuidanceLaw的若干种具体实现)。因为提供的功能库仅为二进制形式,无法直接修改源码,造成了功能扩展的不便。那么,应该如何才能够便捷地实现上述功能呢?或者说,在设计功能模型时,应该如何优化实现方案,以便满足用户实际使用过程中的快捷功能扩展?
...全文
2720 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxyOOOO 2016-05-12
  • 打赏
  • 举报
回复
1. 用dll做plugin是扩展的通常做法。不少sdk提供这种框架给用户做扩展,比方说Steinberg的VST SDK,host和plugin的代码都有。 《C++ API设计》讲的太笼统,没有细节,当然细节不好讲。 2. 用户码和核心码区别对待,你的意图和Generation Gap的意图相似。
Dobzhansky 2016-05-12
  • 打赏
  • 举报
回复
com 就是为你设计的
lm_whales 2016-05-04
  • 打赏
  • 举报
回复
顺序有关的代码。 用一个函数封装。 公共代码,用库封装 接口代码,用抽象类封装
jznudt 2016-04-28
  • 打赏
  • 举报
回复
引用 3 楼 face_t0_sea 的回复:
你现在的架构好像做不到。 使用动态加载类,每种导引律实现提供单独的dll,主程序读取配置文件,加载相应dll,在该dll中获取getinstance的函数地址,调用生成导引律子类实例。要增加新的导引律只需要增加新的dll并修改配置文件。
谢谢你的回复。 我理解,你的意思是不用提供Guidance这个“外观”类,而是将实现的多种导引律用DLL形式封装,并且提供GuidanceLaw这个抽象类(或者说“接口”)。这样一来,可以由用户在自己的主程序中自行确定导引律的具体样式。 这确实是一种解决方案,但在实现过程中可能有些问题,因为在Guidance外观类中,除了GuidanceLaw这个子类之外,还有非常多的功能子类。如果都由用户编写代码,会非常不便,不知道这种情况应该如何解决?
jznudt 2016-04-28
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
这个世界上唯一不变的就是变化。要拥抱变化。
谢谢赵老师的回答。在系统地学习《C++ API设计》这本书过程中,对其中的一个设计准则“对修改关闭,对扩展开放”一直不理解,直到遇到了上面的那个实际问题。我在想,这些设计准则的终极目标是不是都是为了应对“二级制模式下的修改完善”。这样一来,对闭源模型库的设计,就提出了非常高的要求。
qq_28925155 2016-04-27
  • 打赏
  • 举报
回复
hao 很好 非常好
line_us 2016-04-26
  • 打赏
  • 举报
回复
看看应该如何优化实现方案,以便满足用户实际使用过程中的快捷功能扩展
旧剑鞘 2016-04-25
  • 打赏
  • 举报
回复
你现在的架构好像做不到。 使用动态加载类,每种导引律实现提供单独的dll,主程序读取配置文件,加载相应dll,在该dll中获取getinstance的函数地址,调用生成导引律子类实例。要增加新的导引律只需要增加新的dll并修改配置文件。
LeeFige 2016-04-25
  • 打赏
  • 举报
回复
//1.查询 void word_input(); //接受用户输入 //实现中可能需要根据输入语言产生分支 (英译汉汉译英) void word_search(char*); //在数据库中查询 void word_print(); //显示查找结果 void history_add(); //新增查询历史 void history_print(); //显示查询历史 //2. 测试 void test_mode(); //选择测试模式 { int idx; cin>>idx; switch(idx) { case 1: //给单词选含义 case 2: //给例句选单词 //... default: } } void choose_meaning(); //给单词选含义 void choose_word(); //给例句选单词 //... //想法:被测试单词的选择依据其等级 //3.添加例句 void sentence_locate(); //定位生词 void sentence_input(); //输入例句 void sentence_add(); //添加例句 void sentence_print(); //显示例句 //4.单词分级 void set_rank(); //设置(调整)分级 void auto_rank(); //自动调整等级 void manu_rank(); //手动调整等级 void get_rank(); //获取现有等级 /* 想法:分级方式:(根据艾宾浩斯) 0:生词,从未背过 1:今日学习 2:1天前 3:2天前 4:4天前 5:7天前 6:15天前 7:一个月前(之后不再安排复习) 等级改变规则: 复习通过,自动升级 复习未通过,根据情况清零为0,或降级,或平级 手动设置优先 问题:怎么保证手动设置优先? */ //5.调整记忆策略 void set_strategy(); //设置记忆策略 void load_strategy(); //载入记忆策略 void reset_strategy(); //重置记忆策略 void get_strategy(); //获取现有记忆策略 //可能的记忆策略 void daily_strg(); //每天固定数量 void ddl_strg(); //按截止日期 //... //记忆策略下属规则 void daily_new(); //每日新词 void daily_review(); //每日复习 void set_test(); //安排测试 //... //6.生词统计 void read_file(); //读取文本 void word_input(); //输入待统计单词 void word_search(char*); //查找待统计单词 void word_count(char*); //单词计数 void print_count(); //显示统计结果
赵4老师 2016-04-20
  • 打赏
  • 举报
回复
这个世界上唯一不变的就是变化。要拥抱变化。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧