zoukankan      html  css  js  c++  java
  • 设计模式复习-策略模式

     

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

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

    #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;
    }
    
    
    
    
  • 相关阅读:
    201671010105 201620172《Java程序设计》第四章学习心得
    201671010105 201620172《Java程序设计》第一、第二章学习心得
    201671010105 201620172《Java程序设计》第三章学习心得
    201671010105 201620172《Java程序设计》第四周学习心得
    计算三个数字的大小,按从小到大顺序输出。
    js实现网页的两个input标签内的数值加减
    传入一个4位数的整数,进行简单的加密,并1和4,2和3交换输出
    一些简单的循环案例
    计算任意两个个位整数之间所能组成的奇数个数
    js判断输入的年份是否为闰年
  • 原文地址:https://www.cnblogs.com/csnd/p/12061927.html
Copyright © 2011-2022 走看看