c++ 设计模式概述之策略
代码写的不规范,目的是为了缩短文章篇幅,实际中请不要这样做。
1、概述
类比现实生活中的场景,比如,我需要一块8G内存条,我可以选择:A、去线下实体店买,B、线上购买,C、其他渠道。 再比如,吃饭餐具选择,A、用筷子,B、用勺子。 再来一个例子, 外出旅行交通方式: A、坐飞机,B、坐火车,C、坐船、D、骑自行车。 解决问题可能存在多种解决方案。然而每一种对应的方案都可以解决对应问题,可根据实际情况选择。
想起来没 ? 这个背景和工厂模式中的某个方法很相似? 再想想。 对,就是简单工厂中的工厂生产对象的方法,当加入一个新的对象, 就需要做 if_else 或者 switch_case或者map查找判断这样的情况。对象不同多了,对应的分支就多,不易维护。
策略模式的主要角色如下:
A、抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
B、具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
C、环境(Context)类:持有一个策略类的引用,最终给客户端调用。
最近一直在弄加密算法,算法有多种: aes, rsa, md5. hash, 加密类型: 字符串加密的,文件加密的。 下面以 字符串加密为例。
2、抽象类,提供标准接口
// 定义加密字符串算法接口
class encrypt
{
public:
virtual void encrypt_str() = 0;
};
3、AES加密类。继承上面的抽象类,
// 采用AES加密字符串
class encrypt_aes : public encrypt
{
public:
void encrypt_str() { std::cout << "\n采用【AES】加密算法加密字符串\n"; }
};
4、RSA加密类, 继承上面的抽象类,
// RSA算法加密字符串
class encrypt_rsa : public encrypt
{
public:
void encrypt_str() { std::cout << "\n采用【RSA】加密算法加密字符串\n"; }
};
5、加密上下文,
// 加密环境
class encrypt_context
{
public: // 采用何种加密算法
void set_encrypt_type(encrypt *pinstance)
{
if (nullptr != pinstance)
_pencrypt = pinstance;
} // 获取是何种加密算法
encrypt* get_encrypt_type() { return _pencrypt; } private:
encrypt *_pencrypt = nullptr;
};
6、执行加密,范例
1 // 调用命令模型
2 void call_strategy()
3 {
4 std::unique_ptr<encrypt> paes(new(std::nothrow) encrypt_aes);
5 std::unique_ptr<encrypt> prsa(new(std::nothrow) encrypt_rsa);
6 std::unique_ptr<encrypt_context> pcontext(new encrypt_context);
7
8 if (!paes || !prsa || !pcontext)
9 {
10 std::cout << "\n加密算法或者加密环境还没有准备好\n";
11 return;
12 }
13
14 std::cout << "\n\n 下面开始加密演示\n1、aes加密:";
15 encrypt *pret_val = nullptr;
16
17 pcontext->set_encrypt_type(paes.get());
18 pret_val = pcontext->get_encrypt_type();
19 if (nullptr != pret_val)
20 pret_val->encrypt_str();
21
22
23
24 std::cout << "\n\n2、下面开始演示rsa加密,";
25 pret_val = nullptr;
26 pcontext->set_encrypt_type(prsa.get());
27 pret_val = pcontext->get_encrypt_type();
28
29 if (nullptr != pret_val)
30 pret_val->encrypt_str();
31 }
7、加密结果

c++ 设计模式概述之策略的更多相关文章
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...
- PHP设计模式概述
PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...
- java设计模式概述
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...
- 23种GoF设计模式概述
23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...
- Java设计模式(一):设计模式概述、UML图、设计原则
1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- 设计模式(一)----设计模式概述及UML图解析
1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
随机推荐
- Atcoder Typical DP Contest S - マス目(状压 dp+剪枝)
洛谷题面传送门 介绍一个不太主流的.非常暴力的做法( 首先注意到 \(n\) 非常小,\(m\) 比较大,因此显然以列为阶段,对行的状态进行状压.因此我们可以非常自然地想到一个非常 trivial 的 ...
- 洛谷 P6667 - [清华集训2016] 如何优雅地求和(下降幂多项式,多项式)
题面传送门 wjz:<如何优雅地 AK NOI> 我:如何优雅地爆零 首先,按照这题总结出来的一个小套路,看到多项式与组合数结合的题,可以考虑将普通多项式转为下降幂多项式,因为下降幂和组合 ...
- 感谢 git
今天对程序大修了一下,顺便把所有算例测试了一遍,突然发现二维浅水方程有些算例出现了明显的错误. 这次突然出现的错误让我有点措手不及,因为一直没有修改过浅水方程求解器,所以这些算例很久没有测试过了.硬着 ...
- python12对象初
- mysql-加密函数AES_DECRYPT函数
向user表插入数据age字段值为888,并用AES_DECRYPT函数进行加密,key为age(可以自己随意设置,记住就行) insert into user(name,sex,age) value ...
- python2 第二天
requests库 编码和解码 输入和输出,在Python中,为了更好的调试和输出,我们需要对字符串进⾏格式化的输出,⽐如我们定义了姓名和年龄,但是我 们需要输出完整的信息,那么就涉及到字符串格式化的 ...
- C++ 中的多重继承的问题
如何正确使用C++多重继承 BY R12F · PUBLISHED 2011年06月17日 · UPDATED 2012年03月11日 原创文章,转载请注明:转载自Soul Apogee本文链接地 ...
- Java 堆、栈、队列(遇见再更新)
目录 Java 栈.队列 栈 常用方法 案例 队列 Java 栈.队列 栈 常用方法 boolean empty() 测试堆栈是否为空 Object peek() 查看堆栈顶部的对象 Object p ...
- Shell学习(六)——条件判断总结
Shell学习(六)--条件判断总结 [1]https://www.cnblogs.com/zhw-626/p/8528001.html [2]https://www.cnblogs.com/yizh ...
- Java8使用并行流(ParallelStream)注意事项
Java8并行流ParallelStream和Stream的区别就是支持并行执行,提高程序运行效率.但是如果使用不当可能会发生线程安全的问题.Demo如下: public static void co ...