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

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

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

一、C++代码

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 //Suppose the position is 1 when strategy is Gnss ,and 2 when strategy is slam
 6 class LocateStrategy{
 7 public:
 8     LocateStrategy(){}
 9     ~LocateStrategy(){}
10     virtual int locateAlgorithm()=0;
11 };
12
13 class StrategyGnss:public LocateStrategy
14 {
15 public:
16     StrategyGnss() {}
17     ~StrategyGnss() {}
18     int locateAlgorithm(){
19         cout << "Locate By GNSS" << endl;
20         return 1;
21     }
22 };
23
24 class StrategySlam:public LocateStrategy
25 {
26 public:
27     StrategySlam() {}
28     ~StrategySlam() {}
29     int locateAlgorithm(){
30         cout << "Locate By SLAM" << endl;
31         return 2;
32     }
33 };
34
35 class Context
36 {
37 public:
38     Context(LocateStrategy* strategy) {
39         _strategy = strategy;
40     }
41     ~Context(){
42         delete _strategy;
43     }
44     int locateCalculate(){
45        return this->_strategy->locateAlgorithm();
46     }
47 private:
48     LocateStrategy* _strategy;
49 };
50
51 int main()
52 {
53     LocateStrategy *pStrategy = new StrategyGnss();
54     Context *pCon = new Context(pStrategy);
55     cout <<pCon->locateCalculate() << endl;
56
57     //Strategy Replacement
58     pStrategy = new StrategySlam();
59     pCon = new Context(pStrategy);
60     cout <<pCon->locateCalculate() << endl;
61 }

输出:

Locate By GNSS

1

Locate By SLAM

2

二、Java代码

 1 public interface ILocateStrategy {
 2     int locateAlgorithm();
 3 }
 4
 5 public class StrategyGnss implements ILocateStrategy{
 6     public int locateAlgorithm() {
 7         System.out.println("locate calculate by Gnss");
 8         return 1;
 9     }
10 }
11
12 public class StrategySlam implements ILocateStrategy {
13     public int locateAlgorithm() {
14         System.out.println("locate calculate by Slam");
15         return 2;
16     }
17 }
18
19 public class Context {
20     private ILocateStrategy strategy;
21     public Context(ILocateStrategy strategy){
22         this.strategy = strategy;
23     }
24     public int getPosition(){
25         return  strategy.locateAlgorithm();
26     }
27 }
28
29 public class Main {
30     public static void main(String[] args){
31         Context context = new Context(new StrategyGnss());
32         System.out.println(context.getPosition());
33         context = new Context(new StrategySlam());
34         System.out.println(context.getPosition());
35     }
36 }

输出:

locate calculate by Gnss
1
locate calculate by Slam
2

转载于:https://www.cnblogs.com/Asp1rant/p/10764822.html

两种语言实现设计模式(C++和Java)(三:策略模式)相关推荐

  1. 两种语言实现设计模式(C++和Java)(二:单例模式)

    本篇介绍单例模式,可以说是使用场景最频繁的设计模式了.可以根据实例的生成时间,分为饿汉模式和懒汉模式 饿汉模式:饿了肯定要饥不择食.所以在单例类定义的时候就进行实例化. 懒汉模式:故名思义,不到万不得 ...

  2. 无监督方法实现C++、Java、Python 代码转换,程序员:出了bug怎么办,两种语言都要看吗?...

    点击上方"视学算法",选择加"星标" 重磅干货,第一时间送达 本文转载自:机器之心  |  参与:魔王 Facebook 提出的无监督代码转换方法 TransC ...

  3. Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言)

    ** Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言) ** 题目: 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top( ...

  4. Java调用Python脚本:轻松实现两种语言的互操作性

    Java和Python都是非常流行的编程语言,它们都有自己的优点,但也有自己的局限性.在编写应用程序时,我们可能需要使用两种语言来共同完成一项任务.在这种情况下,Java需要调用Python脚本来解决 ...

  5. Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言)

    Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言) 题目: 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元 ...

  6. Leetcode刷题 155题: 最小栈(基于python3和c++两种语言)

    ** Leetcode刷题 155题: 最小栈(基于python3和c++两种语言) ** ** 题目: ** 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. ...

  7. Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言)

    Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言) ** 题目: ** 给你一个目标数组 target 和一个整数 n.每次迭代,需要从 list = {1,2 ...

  8. 两种语言“争霸赛”,PHP速度领先C#

    译者 | 张洁 责编 | 屠敏 有人的地方就有江湖,有江湖的地方就有纷争.提起编程语言话题,总会有人想要不甘示弱地争论一番.这不,就在一位名为@withinboredom的开发者发布的一条" ...

  9. 谷歌智能助理能同时听懂两种语言 超过同类产品

    (原标题:Google Assistant can now speak two languages at once) 网易科技讯 8月31日消息,据国外媒体<连线>报道,在Siri.Ale ...

最新文章

  1. IT人为了自己父母和家庭,更得注意自己的身体和心理健康
  2. 第16届智能小车用AURIX™ 资料汇总
  3. 如何确定开关电源TL431反馈回路的参数
  4. spring教程极客学院,Mybatis-Plus学习总结(超详细整理
  5. strcat()的实现
  6. Rainmeter后续——WIN10任务栏透明以及设置开机启动应用
  7. 关注LoadRunner脚本回放日志中的Warning信息
  8. Allegro-PCB文件默认双击打开
  9. php之sprintf的用法,PHP之sprintf函数用法详解_PHP
  10. 电子计算机审计,计算机审计存在的风险
  11. IOS开发进阶学习资料(提升必备)
  12. 计算机学会a类论文是sci吗,什么是SCI、EI、CCF、DASFAA
  13. 阳光温暖了心情的博客
  14. Can‘t locate XXX/XXX.pm in @INC (you may need to install the XXX::XXX module)
  15. Win11怎么删除微软输入法?
  16. 自动驾驶寻找「商业闭环」
  17. 微商加粉方法,微商加粉,究竟难在哪?
  18. 匿名内部类会导致内存泄露
  19. opencv打开相机获取图像并保存
  20. 移动端模拟导航可点击自动滑动

热门文章

  1. Android登录拦截器实现方式(二)
  2. Drawable、Bitmap、byte[]之间的转换
  3. UITableViewHeader 动态调整高度
  4. Flutter开发之搭建Flutter开发环境(三)
  5. 程序与进程的区别,并发与并行的区别,多进程的实现原理
  6. React router 4 获取路由参数,跨页面参数
  7. 阿里云rds linux平台使用wget 工具下载备份与日志文件
  8. global 和 nonlocal关键字
  9. css y轴溢出滚动条,x轴溢出显示
  10. 金蝶API apiEnv.apiSession.Token = GetToken()报错