代码写的不规范,目的是为了缩短文章篇幅,实际中请不要这样做。

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、加密结果

最新文章

  1. java判断输入的数是不是素数
  2. File存对象--android 的File存储到SD卡();
  3. pip install lxml出错解决
  4. ZeroMQ(java)之Router/Dealer模式
  5. JVM 1.类的加载、连接、初始化
  6. 极客DIY:开源WiFi智能手表制作
  7. Spring框架学习之第1节
  8. Maven中的一点疑惑的地方
  9. java集合——进度1
  10. vijosP1115 火星人
  11. Java---文件夹及文件操作
  12. MySQL中 InnoDB 和 MyISAM 小结
  13. CentOS 下mysql ERROR&amp;n…
  14. JSP慕课网之Session
  15. mysql 中启动服务的命令 、登录命令、退出命令 mysql 的常用命令
  16. sqlserver 循环取时间
  17. POST请求测试地址
  18. 比较有用的php代码片段
  19. Requests库入门——应用实例-网络图片的爬取与保存(好看的小姐姐≧▽≦)
  20. 跨域写cookie

热门文章

  1. 1D RKDG to shallow water equations
  2. fastq文件基本信息统计工具
  3. Redis - 1 - linux中使用docker-compose安装Redis - 更新完毕
  4. add more
  5. 商业爬虫学习笔记day3
  6. oracle 执行计划的获取方法
  7. zabbix之监控面试
  8. transient关键字和volatile关键字
  9. SVN的基本介绍\服务器配置
  10. BigDecimal 计算注意事项