两种语言实现设计模式(C++和Java)(三:策略模式)
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。
本文以自己实际项目中策略模式的实际应用为例:实现无人驾驶车辆的定位有两种方式: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)(三:策略模式)相关推荐
- 两种语言实现设计模式(C++和Java)(二:单例模式)
本篇介绍单例模式,可以说是使用场景最频繁的设计模式了.可以根据实例的生成时间,分为饿汉模式和懒汉模式 饿汉模式:饿了肯定要饥不择食.所以在单例类定义的时候就进行实例化. 懒汉模式:故名思义,不到万不得 ...
- 无监督方法实现C++、Java、Python 代码转换,程序员:出了bug怎么办,两种语言都要看吗?...
点击上方"视学算法",选择加"星标" 重磅干货,第一时间送达 本文转载自:机器之心 | 参与:魔王 Facebook 提出的无监督代码转换方法 TransC ...
- Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言)
** Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言) ** 题目: 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top( ...
- Java调用Python脚本:轻松实现两种语言的互操作性
Java和Python都是非常流行的编程语言,它们都有自己的优点,但也有自己的局限性.在编写应用程序时,我们可能需要使用两种语言来共同完成一项任务.在这种情况下,Java需要调用Python脚本来解决 ...
- Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言)
Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言) 题目: 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元 ...
- Leetcode刷题 155题: 最小栈(基于python3和c++两种语言)
** Leetcode刷题 155题: 最小栈(基于python3和c++两种语言) ** ** 题目: ** 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. ...
- Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言)
Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言) ** 题目: ** 给你一个目标数组 target 和一个整数 n.每次迭代,需要从 list = {1,2 ...
- 两种语言“争霸赛”,PHP速度领先C#
译者 | 张洁 责编 | 屠敏 有人的地方就有江湖,有江湖的地方就有纷争.提起编程语言话题,总会有人想要不甘示弱地争论一番.这不,就在一位名为@withinboredom的开发者发布的一条" ...
- 谷歌智能助理能同时听懂两种语言 超过同类产品
(原标题:Google Assistant can now speak two languages at once) 网易科技讯 8月31日消息,据国外媒体<连线>报道,在Siri.Ale ...
最新文章
- IT人为了自己父母和家庭,更得注意自己的身体和心理健康
- 第16届智能小车用AURIX™ 资料汇总
- 如何确定开关电源TL431反馈回路的参数
- spring教程极客学院,Mybatis-Plus学习总结(超详细整理
- strcat()的实现
- Rainmeter后续——WIN10任务栏透明以及设置开机启动应用
- 关注LoadRunner脚本回放日志中的Warning信息
- Allegro-PCB文件默认双击打开
- php之sprintf的用法,PHP之sprintf函数用法详解_PHP
- 电子计算机审计,计算机审计存在的风险
- IOS开发进阶学习资料(提升必备)
- 计算机学会a类论文是sci吗,什么是SCI、EI、CCF、DASFAA
- 阳光温暖了心情的博客
- Can‘t locate XXX/XXX.pm in @INC (you may need to install the XXX::XXX module)
- Win11怎么删除微软输入法?
- 自动驾驶寻找「商业闭环」
- 微商加粉方法,微商加粉,究竟难在哪?
- 匿名内部类会导致内存泄露
- opencv打开相机获取图像并保存
- 移动端模拟导航可点击自动滑动
热门文章
- Android登录拦截器实现方式(二)
- Drawable、Bitmap、byte[]之间的转换
- UITableViewHeader 动态调整高度
- Flutter开发之搭建Flutter开发环境(三)
- 程序与进程的区别,并发与并行的区别,多进程的实现原理
- React router 4 获取路由参数,跨页面参数
- 阿里云rds linux平台使用wget 工具下载备份与日志文件
- global 和 nonlocal关键字
- css y轴溢出滚动条,x轴溢出显示
- 金蝶API apiEnv.apiSession.Token = GetToken()报错