文档章节

策略模式

NiuYoohoo
 NiuYoohoo
发布于 2017/05/11 22:21
字数 486
阅读 8
收藏 0

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

场景:加密数据时候,可以通过不同的算法来加密数据,但是呢,加密逻辑的相同的,我们把这加密过程用策略模式来实现,可以实现,选择不同的加密算法,或者自定义算法。

UML类图

加密接口如下:

class IEncrypt
{
public:
	typedef unsigned char uint_8;
	virtual void encrypt(const uint_8* src, size_t len, uint_8*& dst, size_t& dst_len, const uint_8* key, size_t key_len) = 0;
	void getInfo(uint_8* ecry, size_t len)
	{
		printf("\n=================================\n");
		printf("Encrypt result:");
		for (int i = 0; i < len;i++)
		{
			printf("%c", ecry[i]);
		}
		printf("\n");
		printf("=================================\n");
	}
};

实现加密算法簇

//亦或加密
class XorEncrypt :public IEncrypt
{
public:
	virtual void encrypt(const uint_8* src, size_t len, uint_8*& dst, size_t& dst_len, const uint_8* key, size_t key_len)
	{
		dst_len = len;
		dst = new uint_8[len];
		for (int i = 0; i < len;i++)
		{
			dst[i] = src[i] ^ key[i%key_len];
		}
	}
};
//改变值加密
class ChangeEncrypt :public IEncrypt
{
public:
	virtual void encrypt(const uint_8* src, size_t len, uint_8*& dst, size_t& dst_len, const uint_8* key, size_t key_len)
	{
		dst_len = len;
		dst = new uint_8[len];
		int key_sum = 0;
		for (int i = 0; i < key_len; i++)
			key_sum += key[i];
		
		key_sum /= key_len;
		for (int i = 0; i < len;i++)
		{
			dst[i] = src[i] + key_sum;
		}
	}
};

加密策略选择

class Encrypt
{
public:
	enum encry_type
	{
		Xor,
		Change
	};
	Encrypt() :pres(nullptr), encry_algorithm(nullptr), res_len(0){}
	~Encrypt()
	{
		if (encry_algorithm)
			delete encry_algorithm;
		if (pres)
			delete pres;
	}
	void make(encry_type type, IEncrypt::uint_8* src, size_t len, IEncrypt::uint_8* key,size_t key_len)
	{
		switch (type)
		{
		case Encrypt::Xor:
			encry_algorithm = new XorEncrypt;
			break;
		case Encrypt::Change:
			encry_algorithm = new ChangeEncrypt;
			break;
		default:
			encry_algorithm = nullptr;
			break;
		}
		if (encry_algorithm)
		{
			encry_algorithm->encrypt(src, len, pres, res_len, key, key_len);
		}
	}
	void makeself(IEncrypt* new_algorithm, IEncrypt::uint_8* src, size_t len, IEncrypt::uint_8* key, size_t key_len)
	{
		encry_algorithm = new_algorithm;
		if (encry_algorithm)
		{
			encry_algorithm->encrypt(src, len, pres, res_len, key, key_len);
		}
	}
	void show()
	{
		if (encry_algorithm)
		{
			encry_algorithm->getInfo(pres, res_len);
		}
	}
protected:
	IEncrypt* encry_algorithm;
	IEncrypt::uint_8 *pres;
	size_t	 res_len;
};

测试

int main()
{
	
	char srcStr[] = "hello,this is a case";
	char key[] = "password";
	Encrypt e;
	e.make(Encrypt::Xor, (IEncrypt::uint_8*)srcStr, 20, (IEncrypt::uint_8*)key, 8);
	e.show();
	Encrypt ex;
	ex.make(Encrypt::Change, (IEncrypt::uint_8*)srcStr, 20, (IEncrypt::uint_8*)key, 8);
	ex.show();
	getchar();
	return 0;
}

 

© 著作权归作者所有

下一篇: 简单工厂模式
NiuYoohoo
粉丝 1
博文 49
码字总数 18987
作品 0
赣州
私信 提问

暂无文章

Bash 和 Python 编程语言优缺点分析

Bash 和 Python 是大多数自动化工程师最喜欢的编程语言。它们都各有优缺点,有时很难选择应该使用哪一个。所以,最诚实的答案是:这取决于任务、范围、背景和任务的复杂性。 让我们来比较一下...

xiangyunyan
21分钟前
3
0
Kubernetes从懵圈到熟练:读懂这一篇,集群节点不下线

排查完全陌生的问题,完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战。今天借这篇文章,跟大家分析一例这样的问题。排查过程中,需要理解一些自己完全陌生的组件,比如sys...

阿里云云栖社区
26分钟前
4
0
解决exe4打包出现的问题

https://blog.csdn.net/gem_yaorao/article/details/48626155

南桥北木
43分钟前
1
0
SpringBoot高级篇JdbcTemplate之数据更新与删除

前面介绍了JdbcTemplate的插入数据和查询数据,占用CURD中的两项,本文则将主要介绍数据更新和删除。从基本使用上来看,姿势和前面的没啥两样 <!-- more --> I. 环境准备 环境依然借助前面一...

小灰灰Blog
59分钟前
3
0
Filecoin 编译问题

https://github.com/filecoin-project/go-filecoin/issues/2503 Error go run ./build build command from root I've faced on this error Building go-filecoin...git log -n 1 --forma......

怎当她临去时秋波那一转
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部