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;
    }
    
    
    
    
  • 相关阅读:
    django 项目需要注意的一些点
    VUE之路
    Oracle 表格碎片的查看方法
    RHEL 6.x or 7.x 使用分区绑定ASM 磁盘的方法
    RMAN 修复主库 nologging 操作导致物理备库的坏块
    Oracle 数据库19c 回退降级到 11.2.0.4 方案
    如何评估oracle 数据库rman全备和增量备份大小
    在将Oracle GI和DB升级到19c或降级到以前的版本之前需要应用的补丁 (Doc ID 2668071.1)
    Oracle 数据库坏块处理
    opatch auto 安装11.2.0.4.20190115 PSU遇到 OUI-67133: Execution of PRE script failed,with returen value 1 报错
  • 原文地址:https://www.cnblogs.com/csnd/p/12061927.html
Copyright © 2011-2022 走看看