• 设计模式复习-策略模式


     

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

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

    #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;
    }
    
    
    
    
  • 相关阅读:
    爬去搜狐新闻体育类
    python中创建迭代器
    python中smtp协议的运用
    人如何修炼才能增强精神力
    修炼精神力量
    Java进阶图谱
    提高做一件事的成功概率
    详细说servlet
    深圳买车上牌流程
    excel 散点图预测
  • 原文地址:https://www.cnblogs.com/csnd/p/12061927.html
Copyright © 2020-2023  润新知