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

 

posted @ 2020-08-13 12:33  mohist  阅读(132)  评论(0编辑  收藏  举报