策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。

本文以自己实际项目中策略模式的实际应用为例:实现无人驾驶车辆的定位有两种方式:GNSS(带差分信号的GPS)和SLAM,实现两种方法的定位可以视为采用两种不同的策略。定义抽象类locateStratey,再通过委托的方式将具体的算法实现委托给具体的Strategy类来实现。

Context委托类是Strategy模式的关键,*Strategy通过“组合”(委托)方式实现算法(实现)的异构,

一、C++代码

 #include <iostream>

 using namespace std;

 //Suppose the position is 1 when strategy is Gnss ,and 2 when strategy is slam
class LocateStrategy{
public:
LocateStrategy(){}
~LocateStrategy(){}
virtual int locateAlgorithm()=;
}; class StrategyGnss:public LocateStrategy
{
public:
StrategyGnss() {}
~StrategyGnss() {}
int locateAlgorithm(){
cout << "Locate By GNSS" << endl;
return ;
}
}; class StrategySlam:public LocateStrategy
{
public:
StrategySlam() {}
~StrategySlam() {}
int locateAlgorithm(){
cout << "Locate By SLAM" << endl;
return ;
}
}; class Context
{
public:
Context(LocateStrategy* strategy) {
_strategy = strategy;
}
~Context(){
delete _strategy;
}
int locateCalculate(){
return this->_strategy->locateAlgorithm();
}
private:
LocateStrategy* _strategy;
}; int main()
{
LocateStrategy *pStrategy = new StrategyGnss();
Context *pCon = new Context(pStrategy);
cout <<pCon->locateCalculate() << endl; //Strategy Replacement
pStrategy = new StrategySlam();
pCon = new Context(pStrategy);
cout <<pCon->locateCalculate() << endl;
}

输出:

Locate By GNSS

Locate By SLAM

二、Java代码

 public interface ILocateStrategy {
int locateAlgorithm();
} public class StrategyGnss implements ILocateStrategy{
public int locateAlgorithm() {
System.out.println("locate calculate by Gnss");
return 1;
}
} public class StrategySlam implements ILocateStrategy {
public int locateAlgorithm() {
System.out.println("locate calculate by Slam");
return 2;
}
} public class Context {
private ILocateStrategy strategy;
public Context(ILocateStrategy strategy){
this.strategy = strategy;
}
public int getPosition(){
return strategy.locateAlgorithm();
}
} public class Main {
public static void main(String[] args){
Context context = new Context(new StrategyGnss());
System.out.println(context.getPosition());
context = new Context(new StrategySlam());
System.out.println(context.getPosition());
}
}

输出:

locate calculate by Gnss
1
locate calculate by Slam
2

最新文章

  1. 常用Linux命令
  2. EventLoop和EventLoopGroup
  3. poj[2104]K-th Number
  4. suid sgid sbit chattr lsattr
  5. bzoj2219: 数论之神
  6. CentOS7 网络管理相关命令
  7. css之属性部分
  8. Ubuntu 升级VisualBox后无法启动 Kernel driver not installed (rc=-1908)
  9. 在Oracle 11g r2中,EXP无法导出个别空的表
  10. android 自定义按钮的外边框
  11. 整数v,从高位到低位,取c位数,得到最大数 (其中:v&gt;=10^c)
  12. android EditText与TextView几个常用的属性
  13. Perl流程控制语句
  14. format()的简单实用 笔记
  15. mysql查询当前时间,一天内,一周,一个月内的sql语句
  16. API网关【gateway 】- 2
  17. Atom 清空残余数据
  18. JavaScript中0和&quot;&quot;的比较问题
  19. jqgrid单元格合并
  20. STL的其他用法(adjacent_find, find_first_of, sort_heap, merge, binary_search)总结

热门文章

  1. Educational Codeforces Round 5F. Expensive Strings
  2. pyqt多线程进度条
  3. 前端JS基础知识
  4. 规则引擎 - (三)BOM工程(上)
  5. OO的奇妙冒险2
  6. 模仿WC.exe的功能实现--node.js
  7. js中的forEach/map方法
  8. 彻底搞懂js原型与原型链
  9. springmvc核心技术
  10. Jeecg