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