1. 程式人生 > 其它 >C++設計模式 - 策略模式(Strategy)

C++設計模式 - 策略模式(Strategy)

元件協作模式:

  • 現代軟體專業分工之後的第一個結果是“框架與應用程式的劃分”,“元件協作”模式通過晚期繫結,來實現框架與應用程式之間的鬆耦合,是二者之間協作時常用的模式。
  • 典型模式

Strategy

動機(Motivation)

  • 在軟體構建過程中,某些物件使用的演算法可能多種多樣,經常改變,如果將這些演算法都編碼到物件中,將會使物件變得異常複雜;而且有時候支援不使用的演算法也是一個性能負擔。
  • 如何在執行時根據需要透明地更改物件的演算法?將演算法與物件本身解耦,從而避免上述問題?

模式定義

定義一系列演算法,把它們一個個封裝起來,並且使它們可互相替換(變化)。該模式使得演算法可獨立於使用它的客戶程式(穩定)而變化(擴充套件,子類化)。

結構

要點總結

  • Strategy及其子類為元件提供了一系列可重用的演算法,從而可以使得型別在執行時方便地根據需要在各個演算法之間進行切換。
  • Strategy模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦合。含有許多條件判斷語句的程式碼通常都需要Strategy模式。
  • 如果Strategy物件沒有例項變數,那麼各個上下文可以共享同一個Strategy物件,從而節省物件開銷。

cpp


class TaxStrategy {
public:
    virtual double Calculate(const Context& context) = 0;
    virtual ~TaxStrategy() {}
};

class CNTax : public TaxStrategy {
public:
    virtual double Calculate(const Context& context) {
        //***********
    }
};

class USTax : public TaxStrategy {
public:
    virtual double Calculate(const Context& context) {
        //***********
    }
};

class DETax : public TaxStrategy {
public:
    virtual double Calculate(const Context& context) {
        //***********
    }
};

//擴充套件
//*********************************
class FRTax : public TaxStrategy {
public:
    virtual double Calculate(const Context& context) {
        //.........
    }
};

class SalesOrder {
private:
    TaxStrategy* strategy;

public:
    SalesOrder(StrategyFactory* strategyFactory) {
        this->strategy = strategyFactory->NewStrategy();
    }
    ~SalesOrder() {
        delete this->strategy;
    }

   double CalculateTax() {
        //...
        Context context();

        double val = strategy->Calculate(context); //多型呼叫
        //...
   }
};