设计模式实现(二)——策略模式的C++实现

一、策略模式的概念

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

二、例子

(1) Strategy抽象类的实现

 1 #ifndef STRATEGY_H
 2 #define STRATEGY_H
 3
 4 class Strategy {
 5 public:
 6     Strategy() = default;
 7     virtual ~Strategy()
 8     {
 9     }
10     virtual int DoOperation(int x, int y) = 0;
11 };
12 #endif // !STRATEGY_H

(2) 加法策略类的实现

 1 #pragma once
 2 #include "Strategy .h"
 3 class OperationAdd :
 4     public Strategy
 5 {
 6 public:
 7     OperationAdd();
 8     ~OperationAdd();
 9     int DoOperation(int x, int y) override;
10 };

 1 #include "pch.h"
 2 #include "OperationAdd.h"
 3
 4
 5 OperationAdd::OperationAdd()
 6 {
 7 }
 8
 9
10 OperationAdd::~OperationAdd()
11 {
12 }
13
14 int OperationAdd::DoOperation(int x, int y)
15 {
16     return x + y;
17 }

(3) 减法策略类的实现

 1 #pragma once
 2 #include "Strategy .h"
 3 class OperationSubstract :
 4     public Strategy
 5 {
 6 public:
 7     OperationSubstract();
 8     ~OperationSubstract();
 9     int DoOperation(int x, int y) override;
10 };

 1 #include "pch.h"
 2 #include "OperationSubstract.h"
 3
 4 OperationSubstract::OperationSubstract()
 5 {
 6 }
 7
 8
 9 OperationSubstract::~OperationSubstract()
10 {
11 }
12
13 int OperationSubstract::DoOperation(int x, int y)
14 {
15     return x - y;
16 }

(4) 乘法策略类的实现

 1 #pragma once
 2 #include "Strategy .h"
 3 class OperationMultiply :
 4     public Strategy
 5 {
 6 public:
 7     OperationMultiply();
 8     ~OperationMultiply();
 9     int DoOperation(int x, int y) override;
10 };

 1 #include "pch.h"
 2 #include "OperationMultiply.h"
 3
 4 OperationMultiply::OperationMultiply()
 5 {
 6 }
 7
 8 OperationMultiply::~OperationMultiply()
 9 {
10 }
11
12 int OperationMultiply::DoOperation(int x, int y)
13 {
14     return x * y;
15 }

(5) context对象的实现

 1 #ifndef CONTEXT_H
 2 #define CONTEXT_H
 3 #include "Strategy .h"
 4
 5 class Context {
 6 public:
 7     Context(Strategy *strategy);
 8     ~Context() = default;
 9     int ExecuteStrategy(int x, int y);
10 private:
11     Strategy *strategy;
12 };
13 #endif // !CONTEXT_H

 1 #include "pch.h"
 2 #include "Context .h"
 3
 4 Context::Context(Strategy * strategy)
 5 {
 6     this->strategy = strategy;
 7 }
 8
 9 int Context::ExecuteStrategy(int x, int y)
10 {
11     return this->strategy->DoOperation(x, y);
12 }

(6) 代码的测试实现

 1 // StrategyDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
 2 //
 3
 4 #include "pch.h"
 5 #include <iostream>
 6 #include <map>
 7 #include <string>
 8 #include "Context .h"
 9 #include "Strategy .h"
10 #include "OperationAdd.h"
11 #include "OperationMultiply.h"
12 #include "OperationSubstract.h"
13 using namespace std;
14
15 std::map<string, Strategy*> strategyMap =
16         { {"add", new (nothrow)OperationAdd},
17           {"sub", new (nothrow)OperationSubstract},
18           {"muti", new (nothrow)OperationMultiply}
19         };
20
21 int main()
22 {
23     int num1, num2;
24     string operationName{};
25     cin >> operationName;
26     cin >> num1 >> num2;
27     Context context(strategyMap[operationName]);
28     cout << context.ExecuteStrategy(num1, num2) << endl;
29     return 0;
30 }

原文地址:https://www.cnblogs.com/madFish/p/12081158.html

时间: 2024-10-09 21:41:57

设计模式实现(二)——策略模式的C++实现的相关文章

设计模式进阶(一) 策略模式

摘自<Design Paterns_Elements of Reusable Object-Oriented Software> 上一系列偏重于入门,从本篇开启进阶系列,着重于设计模式的适用情景. 回顾入门系列 设计模式入门(一)  策略模式 1  Intent Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

设计模式实现C++ --策略模式Strategy(对象行为型)

1.问题 出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机.每个策略都可以得到相同的结果,但是它们使用了不同的资源.选择策略的依据 是费用,时间,使用工具还有每种方式的方便程度. 2.解决方案 策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想. strategy模式类图: 3.应用场景 1. 

从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看着设计模式中的策略模式

今天重温了一下策略模式,将自己的一些感悟与大家分享...本人只是技术渣渣,所理解的东西的难免会有很大的局限性甚至是错误,还请各位带着批判的眼光去看待....不喜请勿吐槽 定义:策略模式属于设计模式中的对象行为型模式,它将用到的算法单独抽象成一个单独的类.通常,我们在多个类完成同一件事情,仅仅完成的方式不同时,我们可以考虑使用这种设计模式. 举例:相信,很多人在看到"假如有以下几种价格10,20,50,请你代码实现将他们排序输出"这种题目的时候,很快就写出了以下代码,写之前还不忘了问一下

【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择.这

设计模式-行为型-策略模式

策略模式(Strategy): 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”. 策略模式的角色: 1)环境类(Context):采用组合或聚合的方式维护一个对Strategy对象的引用. 2)抽象策略类(Strategy):定义所有支持的算法的公共接口.Context使用这个接口来调用某Concret

设计模式(一):策略模式

一.设计背景 现实生活中,我们要做一件事情或者完成某项工作,往往有很多种途径.比如我们出游,可以选择坐汽车,坐火车,土豪点的选择是坐飞机.还有我们现在线下的支付方式也有了很多种选择,以前在外面忘了带钱的话可能一瓶水都难以买到,现在只要我们手机在身上,可以用微信或者支付宝. 在软件设计层面,我们把各种支付方式叫做策略.如果不考虑设计模式的话,我们可能会在一个类中用if..else方式来选择支付方式,即 if(type == 1){ //微信支付 }else if(type == 2){ // 支付

【实战】设计模式应用之策略模式

一.前言 关于设计模式的文章,园子里实在是太多太多,而且讲解的也非常精彩,那为什么我还要在这里记录下这篇文章?本文以实际项目应用“自己动手写工具--XSmartNote”为切入点,来讲述策略模式的应用.很多初学者都有一种感觉,就是在看设计模式相关文章的时候,都看得懂,而且小Demo也是手到擒来,但是就是不知道该怎么用在实际的项目中,不管你之前有没有过这种感觉,反正我是曾经有过.在前几天Review Code的时候发现XSmartNote中的主题管理功能很适合这种模式,于是就把这块相关的代码重构了

设计模式第二站--策略模式

从简单工厂模式出发,现在到达第二站:策略模式.那么什么是策略模式,它作为设计模式的第二站和第一站又有怎样的联系或者区别,它的理解和学习能否让我们用到和联系到第一站?怎么个关联法? 别急!下面我们就一起探究,康忙,北鼻! 一.什么是策略模式(Stragety)?          按照书本上的定义来说,策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换:此模式让算法的变化,不会影响到使用算法的用户. 既然是定义都比较抽象,那么就先通过它的结构图来认识一下这个神秘的事物. 也许还是有些抽象

一道题采用两种设计模式:对比策略模式和模版方法

摘要 <C++ Primer>习题14.38和14.39分别采用策略模式.模版方法解决问题. 问题 <C++ Primer 5th>习题 14.38 : 编写一个类令其检查某个给定的 string 对象的长度是否与一个阀值相等.使用该对象编写程序,统计并报告输入的文件中长度为 1 的单词有多少个.长度为 2 的单词有多少个........长度为 10 的单词有多少个. <C++ Primer 5th>习题 14.39 : 修改上一题的程序令其报告长度在 1 至 9 之间