两种语言实现设计模式(C++和Java)(三:策略模式)
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。
本文以自己实际项目中策略模式的实际应用为例:实现无人驾驶车辆的定位有两种方式: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
两种语言实现设计模式(C++和Java)(三:策略模式)的更多相关文章
- 两种语言实现设计模式(C++和Java)(一:工厂模式)
本篇开始记录实现设计模式在工作中的两种常见语言上的实现. 本篇介绍最简单的工厂模式. 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品:在工厂中加工产品,使用产 ...
- 两种语言实现设计模式(C++和Java)(二:单例模式)
本篇介绍单例模式,可以说是使用场景最频繁的设计模式了.可以根据实例的生成时间,分为饿汉模式和懒汉模式 懒汉模式:饿了肯定要饥不择食.所以在单例类定义的时候就进行实例化. 饿汉模式:故名思义,不到万不得 ...
- 两种语言实现设计模式(C++和Java)(四:适配器模式)
参考:http://blog.jobbole.com/109381/ 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 系统的数 ...
- 设计模式之第8章-策略模式(Java实现)
设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...
- 队列的图文解析 和 对应3种语言的实现(C/C++/Java)
概要 本章和介绍"栈"时的流程一样,先对队列进行介绍,然后分别给出队列的C.C++和Java三种语言的实现.内容包括:1. 队列的介绍2. 队列的C实现3. 队列的C++实现4. ...
- I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor
不同的操作系统实现的io策略可能不一样,即使是同一个操作系统也可能存在多重io策略,常见如linux上的select,poll,epoll,面对这么多不同类型的io接口,这里需要一层抽象api来完成, ...
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)【转】
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...
随机推荐
- 使用session统计在线人数
效果图如下 这里是Chrome浏览器新登录一个用户 代码展示 package com.test.Util; import java.util.ArrayList; import javax.servl ...
- 数据结构与算法之PHP递归函数
一.递归函数的定义 递归函数即自调用函数,在函数体内部直接或者间接的自己调用自己,即函数的嵌套调用是函数本身. 通常在此类型的函数题中会附加一个条件判断叙述,以判断是否需要执行递归调用,并且在特定的条 ...
- VM Linux版本安装
安装方法 https://www.jb51.net/softs/619194.html 1. 增加执行权限: sudo chmod +x VMware-Workstation-Full-14.1.2- ...
- rtmp详解
文件下载地址: 中文:https://files.cnblogs.com/files/bugutian/rtmp_specification_1.0_cn.zip 英文:http://www.adob ...
- 了解计算机与操作系统发展阶段以及android操作系统的发展史
计算机与操作系统发展阶段 计算机的发展: 第一代(1946-1957年),电子管计算机 第二代(1958-1964年),晶体管计算机 第三代 (1964—1970年),集成电路数字机 第四代 (19 ...
- angular组件
- Spring Boot(一)
(一)如何使用IDEA新建一个Spring Boot项目 https://www.cnblogs.com/wmyskxz/p/9010832.html
- mybatis的配置与使用
mybatis的配置与使用 一.全局配置文件配置 properties标签 Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到一个配置文件(db.properties ...
- 【C语言】数组知识点总结
[C语言]数组知识点总结 标签: 数组 2018年04月12日 17:44:4481人阅读 评论(0) 收藏 举报 分类: C语言知识总结(4) 版权声明:本文为博主原创文章,未经博主允许不得转载 ...
- 颠覆区块链的钱包——AngelToken钱包
币圈的玩家/大佬们的刚需产品Angel token钱包您有吗? 当前由法国凡赛公司技术团队研发的去中心化AngelToken智能钱包,它兼容比特币底层技术系列币种,同时也兼容以太坊底层技术系列币 ...