(三)策略模式-C++实现

策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换,本模式使得算法可独立于使用它的客户而变化。

三种角色:

1、策略:一个抽象类,这个接口定义了若干个算法标识,即多个虚函数,这些个算法的实现在不同场景可能会不一样。

2、具体策略:它实现了策略,实现抽象类中定义个算法标识,即给出具体算法实现。

3、上下文:它依赖于策略抽象类,即上下文 包含 策略声明的指针,上下文中提供一个方法,该方法委托策略调用具体策略所实现的算法。

    C++实现包含三个文件,一个头文件策略类的声明strategy.h,两个源文件strategy.cpp 和context.cpp,一个是具体策略中方法的实现,另一个是上下文的源文件,将测试用的主函数也放在这个文件中。

1、strategy.h

 1 #ifndef _STRATEGY_H_
 2 #define _STRATEGY_H_
 3 
 4 //抽象策略类
 5 class ComputeStrategy{
 6 public:
 7     //这里参数是a[] 实际上相当于指针 所以想获取其长度 非常困难(应该获取不了) 所以传入一个个数
 8     virtual double computeScore(double a[], int len) = 0;
 9 };
10 
11 //具体策略类
12 class StrategyOne : public ComputeStrategy
13 {
14 public:
15     double computeScore(double a[], int len);
16 };
17 
18 class StrategyTwo : public ComputeStrategy
19 {
20 public:
21     double computeScore(double a[], int len);
22 };
23 
24 class StrategyThree : public ComputeStrategy
25 {
26 public:
27     double computeScore(double a[], int len);
28 };
29 
30 
31 
32 #endif
View Code

2、strategy.cpp

 1 #include "strategy.h"
 2 #include <iostream>
 3 #include <cmath>
 4 #include <algorithm>
 5 
 6 double StrategyOne::computeScore(double a[], int len)
 7 {
 8     double score = 0, sum = 0;
 9     for (int i = 0; i < len; i++)
10     {
11         sum += a[i];
12     }
13     score = sum / len;
14     return score;
15 }
16 
17 double StrategyTwo::computeScore(double a[], int len)
18 {
19     double score = 0, multi = 1;
20     for (int i = 0; i < len; i++)
21     {
22         multi *= a[i];
23     }
24     score = std::pow(multi, 1.0 / len);
25     return score;
26 }
27 
28 double StrategyThree::computeScore(double a[], int len)
29 {
30     double score = 0, sum = 0;
31     if (2 >= len)
32     {
33         return 0.0;
34     }
35 
36     std::sort(a, a + len);
37     for (int i = 1; i < len - 1; i++)
38     {
39         sum += a[i];
40     }
41     score = sum / (len - 2);
42     return score;
43 
44 }
View Code

3、context.cpp

 1 #include <iostream>
 2 #include "strategy.h"
 3 
 4 //上下文类 依赖策略类
 5 class Context
 6 {
 7 public:
 8     ComputeStrategy* myStrategy;
 9 public:
10     void setStrategy(ComputeStrategy* strategy)
11     {
12         myStrategy = strategy;
13     }
14     double getPersonScore(double a[], int len)
15     {
16         if (NULL != myStrategy)
17         {
18             std::cout << "myStrategy not null" << std::endl;
19             return myStrategy->computeScore(a, len);
20         }
21         else
22         {
23             return 0;
24         }
25 
26     }
27 
28 };
29 
30 
31 int main()
32 {
33     Context *game = new Context();
34     double a[] = { 9.12, 9.25, 8.87, 9.99, 6.99, 7.88 };
35     int len = sizeof(a) / sizeof(double);
36 
37     game->setStrategy(new StrategyOne());
38     double r1 = game->getPersonScore(a,len);
39     std::cout << "strategy one: " << r1 << std::endl;
40 
41     game->setStrategy(new StrategyTwo());
42     double r2 = game->getPersonScore(a, len);
43     std::cout << "strategy two: " << r2 << std::endl;
44 
45     game->setStrategy(new StrategyThree());
46     double r3 = game->getPersonScore(a, len);
47     std::cout << "strategy three : " << r3 << std::endl;
48 
49     delete game;
50     game = NULL;
51 
52     return 0;
53 }
View Code

    在实现中,值得注意的是,设置具体的策略的时候,函数的形参是类的指针。然后本例子实现的是一个统计分数数组的平均分的不同策略,而C++中在数组作为参数的时候,实际上是退化为指针了,而这样是无法获取数组的长度的,所以

也传入了一个长度参数。

转载于:https://www.cnblogs.com/leewhite/p/6034057.html

(1)普通用户端(Web 交互平台) 热门话题总览: 实时榜单:展示 "热搜榜 TOP50"(每 10 分钟更新),包含话题名称、热度值、上升速度、持续时间,支持按 "社会 / 娱乐 / 科技" 等类别筛选。 话题卡片:每个话题以卡片形式展示核心信息,悬停显示 "相关话题、参与人数、情感倾向分布",点击进入详情页。 基础可视化浏览: 趋势图表:热门话题的 "热度随时间变化折线图"(支持选择 1 小时 / 24 小时 / 7 天时间范围)、"情感占比饼图"。 互动数据:展示话题相关微博的 "转发 / 评论 / 点赞总量对比" 柱状图,突出 "高互动量节点"(如某明星发布相关微博的时间点)。 (2)媒体工作者端(Web 平台) 深度分析功能: 多维度筛选:支持按 "时间范围、用户粉丝量、地域分布" 筛选话题数据,生成 "不同时段情感变化"、"各省市讨论热度" 等细分图表。 话题关联分析:展示 "核心话题与相关子话题的关联网络"(力导向图),标注 "关联强度"(线条粗细)和 "互动量占比"。 报告导出功能: 图表导出:支持将可视化图表导出为 "PNG(高清)/SVG(矢量)/PDF" 格式,保留数据来源标注(如 "数据采集时间:2024-10-01")。 分析简报:自动生成包含 "话题概述、核心发现、数据图表" 的简报文档(Word/PDF),支持添加自定义分析结论。 (3)数据分析人员端(Web+Jupyter) 高级分析工具: 自定义分析:通过 Jupyter Notebook 集成的 Python 分析环境(预装 pandas/matplotlib/seaborn),编写脚本处理原始数据,支持调用系统 API 获取指定话题数据。 模型参数调整:对情感分析模型、话题聚类算法进行参数优化(如调整 LDA 模型的主题数量),测试不同参数对分析结果的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值