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 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
随机推荐
- 【宏组学】如何根据taxid(或taxname)快速获得taxname(或taxid)?
需求 我有一个物种taxonomy ID的list,想获得相应的物种名,不要一个个去NCBI Taxonomy官网查.反之根据物种名list查询对应的taxid. 实现 因为之前没怎么用过,我的第一个 ...
- C语言 字符串指针和字符串数组使用区别
字符串指针和字符串数组使用区别 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 ...
- ARM汇编基础指令
Cortex-A7 常用汇编指令 一.处理器内部数据传输指令 1.mov 将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面 MOV R0,R1 @将寄存器 R1 中的数据传递给 ...
- 11 — springboot集成swagger — 更新完毕
1.前言 理论知识滤过,自行百度百科swagger是什么 2.导入依赖 <!-- swagger所需要的依赖--> <dependency> <groupId>io ...
- 日常Java 2021/10/10
多态就是同一个行为具有多个不同表现形式的能力 多态就是同一个接口,使用不同的实例而执行不同操作 多态的优点 1.消除类型之间的耦合关系 2.可替换性 3.可扩充性 4.接口性 5.灵活性 6.简化性 ...
- Erda 系列 Meetup「成都站」携手SOFAStack 和你聊聊云原生基础设施建设那点事儿
技术控快上车啦秋天的第一场活动一起来收获技术干货吧! 主题: 云原生基础设施建设的现在及未来时间: 2021 年 9 月 11 日 (周六) 13:30-17:00活动地点: 四川省成都市蚂蚁 C 空 ...
- 【Reverse】初遇花指令
解密花指令 全文参考了一个大师傅的blog:https://blog.csdn.net/zhangmiaoping23/article/details/38400393 介绍 花指令是对抗反汇编的有效 ...
- [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解
我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴 ...
- Give You My Best Wishes
亲耐滴IT童鞋们: 感谢大家一直以来的支持,因为有你们的支持,才有我这么"拼"的动力!!爱你们哟 OC的学习已经告一段落,希望大家通过阅读这几篇浅薄的随笔,能够寻找到解决问题的方法 ...
- SQL注入 (1) SQL注入类型介绍
SQL注入 SQL注入介绍与分类 1. 什么是sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2. sql注入类型 按照注入 ...