程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 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
請按任意鍵繼續. . .

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved