设计模式复习-策略模式

 

        封装一系列算法,算法之间互相增加替换,不会影响到客户端,相当于是先定义一个统一接口,然后各个算法继承这个接口实现,然后,再层状一层逻辑调用,客户端只需要调用这个最后封装的类就好了,但是这样的话客户端在算法选择使用的时候需要自己实例化具体算法,所以可以考虑用工厂把这个策略类继续优化下即可。

实现代码(基本策略模式+工厂优化过的)

#pragma once
#include "stdafx.h"
#include<iostream>
#include<windows.h>
using namespace std;

//策略模式基本实现
class InterFace {
public:
	virtual DWORD getValue(const DWORD &numberA ,const DWORD &numberB) = 0;
};

class Addition : public InterFace {
public:
	DWORD getValue(const DWORD &numberA, const DWORD &numberB) {
		return numberA + numberB;
	}
};

class Subtrantion :public InterFace {
public:
	DWORD getValue(const DWORD &numberA, const DWORD &numberB) {
		return numberA - numberB;
	}
};

class Strategy {
private:
	InterFace *mpAlgorithm = NULL;
public:
	VOID setStrategy(InterFace *pAlgorithm) {
		mpAlgorithm = pAlgorithm;
	}
	DWORD runAlgorithm(const DWORD &numberA ,const DWORD &numberB) {
		return mpAlgorithm->getValue(numberA , numberB);
	}
};


//策略模式客户端调用
int main()
{
	Strategy *pstrategy = new Strategy();
	InterFace *padditon = new Addition();
	InterFace *psubtrantion = new Subtrantion();

	pstrategy->setStrategy(padditon);
	cout<<pstrategy->runAlgorithm(1,1)<<endl;

	pstrategy->setStrategy(psubtrantion);
	cout << pstrategy->runAlgorithm(1, 1) << endl;

	delete pstrategy;
	delete padditon;
	delete psubtrantion;
	
	getchar();
	return 0;
}



#pragma once
#include "stdafx.h"
#include<iostream>
#include<windows.h>
using namespace std;

//工厂简单改下策略模式,减少客户端操作(选择)的复杂度
class InterFace {
public:
	virtual DWORD getValue(const DWORD &numberA ,const DWORD &numberB) = 0;
};

class Addition : public InterFace {
public:
	DWORD getValue(const DWORD &numberA, const DWORD &numberB) {
		return numberA + numberB;
	}
};

class Subtrantion :public InterFace {
public:
	DWORD getValue(const DWORD &numberA, const DWORD &numberB) {
		return numberA - numberB;
	}
};

class Strategy {
private:
	InterFace *mpNowAlgorithm = NULL;
	InterFace *mpCacheAlgorithm[2] = {NULL ,NULL};

public:
	Strategy() {
		mpCacheAlgorithm[0] = new Addition();
		mpCacheAlgorithm[1] = new Subtrantion();
	}
	VOID setStrategy(const DWORD &key) {
		switch (key) {
				case 0: 
					mpNowAlgorithm = mpCacheAlgorithm[0]; break;
				case 1:
					mpNowAlgorithm = mpCacheAlgorithm[1]; break;
				default:
					mpNowAlgorithm = NULL;
		}
	}
	~Strategy() {
		delete mpCacheAlgorithm[0];
		delete mpCacheAlgorithm[1];
	}

	DWORD runAlgorithm(const DWORD &numberA ,const DWORD &numberB) {
		return mpNowAlgorithm->getValue(numberA , numberB);
	}
};


//策略模式客户端调用
int main()
{
	Strategy *pstrategy = new Strategy();

	pstrategy->setStrategy(0);
	cout<<pstrategy->runAlgorithm(1,1)<<endl;

	pstrategy->setStrategy(1);
	cout << pstrategy->runAlgorithm(1, 1) << endl;

	delete pstrategy;

	getchar();
	return 0;
}



原文地址:https://www.cnblogs.com/csnd/p/12061927.html