天天看點

C++政策模式簡述模式結構優缺點适用場景案例分析代碼實作

簡述

政策模式(Strategy Pattern)定義一系列算法,把它們一個個封裝起來,并且使它們可以互相替換。Strategy 可以使算法獨立于使用算法的用戶端。

版權所有:一去丶二三裡,轉載請注明出處:

http://blog.csdn.net/liang19890820

UML 結構圖:

  • Context(環境角色):持有一個對 Strategy 的引用,最終給用戶端調用。
  • Strategy(抽象政策):定義了一個公共接口,讓不同的算法以不同的方式來實作。通過這個接口,Context 可以調用不同的算法。
  • ConcreteStrategy(具體政策):實作 Strategy 定義的接口,提供具體算法的實作。

優點:

  • 各自使用封裝的算法,可以很容易地引入新的算法來滿足相同的接口。
  • 由于實作的是同一個接口,是以政策之間可以自由切換。
  • Strategy 使用戶端能夠選擇所需的算法,而無需使用

    switch/case

    if/else

    語句。
  • 算法的細節完全封裝在 Strategy 類中,是以,可以在不影響 Context 類的情況下更改算法的實作。

缺點:

  • 用戶端必須知道所有的政策,了解它們之間的差別,以便适時選擇恰當的算法。
  • 政策模式将造成産生很多政策類,可以通過使用享元模式在一定程度上減少對象的數量。

  • 多個類有不同的表現形式,每種表現形式可以獨立成單獨的算法。
  • 需要在不同情況下使用不同的算法,以後算法可能還會增加。
  • 對用戶端隐藏具體算法的實作細節,彼此完全獨立。

說走就走的旅行 - 出行方式

每天,我們做着同樣的工作,遇見同樣的人,吃着同樣的食物。。。日複一日,年複一年!當生活陷入重複,想遇到新鮮的人,新鮮的事,為蒼白的生活添加一些色彩,何不來一場說走就走的旅行呢!

要出去玩,有很多種出行方式,自行車、公共汽車、自駕、地鐵、火車、飛機。。。如何選擇最合适的呢?

  • 如果離家近,又怕堵車,可以騎自行車。
  • 如果離家遠,但想省錢,早點出發,可以乘公共汽車。
  • 如果有車,并且不介意支付停車費,可以選擇自駕。
  • 如果沒有車,但趕時間,可以乘計程車。

這裡的每一種出行方式都是一種具體的政策。如何選擇,需要基于成本、便利和時間之間的權衡。

建立抽象政策

抽象政策由 IStrategy 表示,它提供了一個

Travel()

接口,用于提供出行方式:

// strategy.h
#ifndef STRATEGY_H
#define STRATEGY_H

// 出行政策
class IStrategy
{
public:
    virtual void Travel() = 0;
};

#endif // STRATEGY_H           

建立具體政策

有三種具體的政策可供選擇,騎自行車、開車、坐火車:

// concrete_strategy.h
#ifndef CONCRETE_STRATEGY_H
#define CONCRETE_STRATEGY_H

#include "strategy.h"
#include <iostream>

// 騎自行車
class BikeStrategy : public IStrategy
{
public:
    virtual void Travel() override { std::cout << "Travel by bike" << std::endl; }
};

// 開車
class CarStrategy : public IStrategy
{
public:
    virtual void Travel() override { std::cout << "Travel by car" << std::endl; }
};

// 坐火車
class TrainStrategy : public IStrategy
{
public:
    virtual void Travel() override { std::cout << "Travel by train" << std::endl; }
};

#endif // CONCRETE_STRATEGY_H           

建立環境角色

環境角色對外提供了一個

Travel()

接口,最終由用戶端調用。在内部,它最終調用的是 IStrategy 的相應方法:

// context.h
#ifndef CONTEXT_H
#define CONTEXT_H

#include "strategy.h"

class Context
{
public:
    Context(IStrategy *strategy) { m_pStrategy = strategy; }
    void Travel() { m_pStrategy->Travel(); }

private:
    IStrategy *m_pStrategy;
};

#endif // CONTEXT_H           

建立用戶端

旅程開始,盡情享受吧:

// main.cpp
#include "context.h"
#include "concrete_strategy.h"

#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif

int main()
{
    // 政策之間可以互相替換
    IStrategy *bike = new BikeStrategy();
    IStrategy *car = new CarStrategy();
    IStrategy *train = new TrainStrategy();

    Context *bikeContext = new Context(bike);
    Context *carContext = new Context(car);
    Context *trainContext = new Context(train);

    bikeContext->Travel();
    carContext->Travel();
    trainContext->Travel();

    SAFE_DELETE(bike);
    SAFE_DELETE(car);
    SAFE_DELETE(train);

    SAFE_DELETE(bikeContext);
    SAFE_DELETE(carContext);
    SAFE_DELETE(trainContext);

    getchar();

    return 0;
}           

輸出如下:

Travel by bike

Travel by car

Travel by train

繼續閱讀