当前位置:编程学习 > C/C++ >>

设计模式笔记之---策略模式

策略模式(Strategy):定义了一系列的算法,将它们分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户端。
        策略模式的主要目的是将算法的定义和使用分开,具体算法的定义放在专门的策略类中,每一种策略封装了一种实现算法,使用算法的环境类针对抽象策略(接口)进行编程,遵循了“依赖倒转原则”。由于算法和环境独立开来,减少了各种算法类和使用算法类之间的耦合。
UML类图:
                 
策略模式基本代码如下:
[cpp] 
/********************************************************************
filename:   Strategy.h
created:    2012-09-24
author:     zfhu
 
purpose:    firehood 学设计模式之---策略模式
*********************************************************************/ 
#pragma once 
#include <iostream>   
using namespace std;   
 
// 抽象策略 
class Strategy 

public: 
    Strategy(void){} 
    virtual ~Strategy(void){} 
    virtual void execute() = 0; 
}; 
 
// 具体策略A 
class ConcreteStrategyA : public Strategy 

public: 
    ConcreteStrategyA(void){} 
    virtual ~ConcreteStrategyA(void){} 
    virtual void execute() 
    { 
        cout<<"执行策略A"<<endl; 
    } 
}; 
 
// 具体策略B 
class ConcreteStrategyB : public Strategy 

public: 
    ConcreteStrategyB(void){} 
    virtual ~ConcreteStrategyB(void){} 
    virtual void execute() 
    { 
        cout<<"执行策略B"<<endl; 
    } 
}; 
 
// 上下文 
class Context 

public: 
    Context(Strategy* pStrategy):m_pStrategy(NULL) 
    { 
        m_pStrategy = pStrategy; 
    } 
    virtual ~Context() 
    { 
        if(m_pStrategy) 
        { 
            delete m_pStrategy; 
            m_pStrategy = NULL; 
        } 
    } 
    // 上下文接口 
    void ContextInterface() 
    { 
        if(m_pStrategy != NULL) 
            m_pStrategy->execute(); 
    } 
private: 
    Strategy* m_pStrategy; 
}; 

客户端调用代码如下:
[cpp] 
#include "Strategy.h" 
#include <iostream> 
using namespace std; 
 
int main(int argc,char* argv[]) 

    cout<<"*************************************"<<endl; 
    cout<<"firehood 学设计模式之---策略模式"<<endl; 
    cout<<"*************************************"<<endl; 
     
    Context *pContext = NULL; 
    pContext = new Context(new ConcreteStrategyA()); 
    pContext->ContextInterface(); 
    delete pContext; 
  
    pContext = new Context(new ConcreteStrategyB()); 
    pContext->ContextInterface(); 
    delete pContext; 
 
    system("pause"); 
    return 0; 

运行结果如下:
*************************************
firehood 学设计模式之---策略模式
*************************************
执行策略A
执行策略B
请按任意键继续. . .

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,