(三)策略模式-C++实现
策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换,本模式使得算法可独立于使用它的客户而变化。
三种角色:
1、策略:一个抽象类,这个接口定义了若干个算法标识,即多个虚函数,这些个算法的实现在不同场景可能会不一样。
2、具体策略:它实现了策略,实现抽象类中定义个算法标识,即给出具体算法实现。
3、上下文:它依赖于策略抽象类,即上下文 包含 策略声明的指针,上下文中提供一个方法,该方法委托策略调用具体策略所实现的算法。
C++实现包含三个文件,一个头文件策略类的声明strategy.h,两个源文件strategy.cpp 和context.cpp,一个是具体策略中方法的实现,另一个是上下文的源文件,将测试用的主函数也放在这个文件中。
1、strategy.h
#ifndef _STRATEGY_H_
#define _STRATEGY_H_ //抽象策略类
class ComputeStrategy{
public:
//这里参数是a[] 实际上相当于指针 所以想获取其长度 非常困难(应该获取不了) 所以传入一个个数
virtual double computeScore(double a[], int len) = ;
}; //具体策略类
class StrategyOne : public ComputeStrategy
{
public:
double computeScore(double a[], int len);
}; class StrategyTwo : public ComputeStrategy
{
public:
double computeScore(double a[], int len);
}; class StrategyThree : public ComputeStrategy
{
public:
double computeScore(double a[], int len);
}; #endif
2、strategy.cpp
#include "strategy.h"
#include <iostream>
#include <cmath>
#include <algorithm> double StrategyOne::computeScore(double a[], int len)
{
double score = , sum = ;
for (int i = ; i < len; i++)
{
sum += a[i];
}
score = sum / len;
return score;
} double StrategyTwo::computeScore(double a[], int len)
{
double score = , multi = ;
for (int i = ; i < len; i++)
{
multi *= a[i];
}
score = std::pow(multi, 1.0 / len);
return score;
} double StrategyThree::computeScore(double a[], int len)
{
double score = , sum = ;
if ( >= len)
{
return 0.0;
} std::sort(a, a + len);
for (int i = ; i < len - ; i++)
{
sum += a[i];
}
score = sum / (len - );
return score; }
3、context.cpp
#include <iostream>
#include "strategy.h" //上下文类 依赖策略类
class Context
{
public:
ComputeStrategy* myStrategy;
public:
void setStrategy(ComputeStrategy* strategy)
{
myStrategy = strategy;
}
double getPersonScore(double a[], int len)
{
if (NULL != myStrategy)
{
std::cout << "myStrategy not null" << std::endl;
return myStrategy->computeScore(a, len);
}
else
{
return ;
} } }; int main()
{
Context *game = new Context();
double a[] = { 9.12, 9.25, 8.87, 9.99, 6.99, 7.88 };
int len = sizeof(a) / sizeof(double); game->setStrategy(new StrategyOne());
double r1 = game->getPersonScore(a,len);
std::cout << "strategy one: " << r1 << std::endl; game->setStrategy(new StrategyTwo());
double r2 = game->getPersonScore(a, len);
std::cout << "strategy two: " << r2 << std::endl; game->setStrategy(new StrategyThree());
double r3 = game->getPersonScore(a, len);
std::cout << "strategy three : " << r3 << std::endl; delete game;
game = NULL; return ;
}
在实现中,值得注意的是,设置具体的策略的时候,函数的形参是类的指针。然后本例子实现的是一个统计分数数组的平均分的不同策略,而C++中在数组作为参数的时候,实际上是退化为指针了,而这样是无法获取数组的长度的,所以
也传入了一个长度参数。
(三)策略模式-C++实现的更多相关文章
- Java设计模式从精通到入门三 策略模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: 以周瑜赔了夫人又折兵的例 ...
- JS 设计模式三 -- 策略模式
策略模式 概念 定义一系列算法,把它们一个个封装起来. 将算法的使用与算法的实现分离开来 实现 // 加权映射关系 var levelMap = { S: 10, A: 8, B: 6, C: 4 } ...
- Javascript模式(三) 策略模式
var data = { "username" : "zhangsan", "password" : "12345690" ...
- 设计模式:HelloWorld之策略模式
一.概述 策略模式 定义了算法族,分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式的三要素: 抽象策略角色: 策略类,通常由一个接口或者抽象类实现. 具体策略角色: ...
- 计算器软件实现系列(六)windowform窗体+SQL+策略模式
一 整体概述 这个计算器软件的功能和以前的功能基本上一样,只不过是数据的保存形式发生了变化,,以前用的是txt文件保存,现在更正用SQL数据库,现在更改了以前的文件保存形式,是三层架构中数据层的更换, ...
- Javascript设计模式学习三(策略模式)
定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换.目的:将算法的使用和算法的实现分离开来.比如: if(input == 'A'){ return 1; } if(input == ...
- JAVA中的设计模式三(策略模式)
问题: 如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化? 方案: 把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就 ...
- 两种语言实现设计模式(C++和Java)(三:策略模式)
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异.用策略模式 ...
- JavaScript设计模式(三) - 策略模式
什么是策略模式? 策略模式支持在运行时由使用者选择合适的算法,对于使用者而言不用关心背后的具体实现,由使用者自动根据当前程序执行的上下文和配置,从已有的算法列列表中选择出合适的算法来处理当前任务. ...
随机推荐
- 移动 Web 开发必备!时尚的 Off Canvas 导航
这里向大家分享一组创新的 Off Canvas 导航效果.Off Canvas 导航在一些移动应用程序中被广泛使用.当你点击汉堡按钮(一般是三条横线组成)时,在左侧或者右侧拉出一个菜单,这样可以充分利 ...
- JS中数组去除重复
法一:返回新数组每个位子类型没变 function outRepeat(a){ var hash=[],arr=[]; for (var i = 0; i < a.length; i++) { ...
- windows Python 3.4.3 安装图文
1.去官网(https://www.python.org/downloads/)下载软件. 2.运行安装程序: 下一步 next. 下一步 next 全部选中,下一步 next. 安装中..来自:ht ...
- checkbox全选,反选,取消选择 jquery
checkbox全选,反选,取消选择 jquery. //checkbox全部选择 $(":checkbox[name='osfipin']").each(function(){ ...
- HTML中tr标签设置边框不显示的解决办法
今天在操作表格的时候发现设置表格中行的边框没有显示,然后自己新建了一个表格发现确实不显示 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...
- iOS 判断数组是否为空
有人说可以用([array count]==0 )来判断是否为空,都是坑,如果array为空的话,执行count就会直接报错,程序崩溃退出. 正确判断NSArray是否为空的方法:用 (!array) ...
- SharePoint 2013 搜索报错"Unable to retrieve topology component health. This may be because the admin component is not up and running"
环境描述 Windows 2012 R2,SharePoint 2013(没有sp1补丁),sql server 2012 错误描述 搜索服务正常,但是爬网一直在Crawling Full,但是爬不到 ...
- tableView的footerView下面的颜色修改、限制文本框的输入字数
- Android JNI 和 NDK
1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...
- App开发流程之右滑返回手势功能
iOS7以后,导航控制器,自带了从屏幕左边缘右滑返回的手势功能. 但是,如果自定义了导航栏返回按钮,这项功能就失效了,需要自行实现.又如果需要修改手势触发范围,还是需要自行实现. 广泛应用的一种实现方 ...