1. 程式人生 > >設計模式系列2 策略模式

設計模式系列2 策略模式

什麼是策略模式

策略是對演算法的封裝,是一種形為模式,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。

策略模式和簡單工廠很相似,確有不同,策略是一種行為模式,而簡單工廠是建立型模式。

為什麼用策略模式/策略模式的好處

優點

  • 是一種行為模式,對演算法封裝,使得客戶端獨立於各個策略。
  • 擴充套件性強,新增策略無非就是新增一個具體的實現類而已,代價非常低。

缺點

  • 客戶端必須知道所有的策略類,並自行決定使用哪個策略類。
  • 造成很多的策略類

注:解決辦法:使用工廠模式

使用場景

原則

  • 多個類只區別在表現行為不同,可以使用Strategy模式,在執行時動態選擇具體要執行的行為。
  • 需要在不同情況下使用不同的策略(演算法),或者策略還可能在未來用其它方式來實現。
  • 對客戶隱藏具體策略(演算法)的實現細節,彼此完全獨立。

  • 圖書銷售演算法(不同書本折扣的演算法)
  • 遊戲裡角色或武器的切換
  • 自動售貨飲料機
  • 十一旅遊乘車選擇

例子(圖書銷售折扣程式碼實現)

UML

建立一個Book介面。

public interface Book {
    double discount();
}

建立實現Book介面的文學類實體類。

public class LiteratureBook implements Book {
    @Override
    public double discount() {
        return 0.30D;
    }
}

建立實現Book介面的程式設計類實體類

public class ProgrammingBook implements Book {

    @Override
    public double discount() {
        return 0.25D;
    }
}

建立 Discount 類。用於動態獲取不同型別折扣,兩種方式

  • 初始化
  • setXXX()
public class Discount {

    Book book;

    public Discount(Book book) {
        this.book = book;
    }

    public double getDiscount() {
        return book.discount();
    }

    public void setSoft(Book book) {
        this.book = book;
    }
}

測試類

public static void main(String[] args) {
    Discount discount = new Discount(new LiteratureBook());
    System.out.println("文學類折扣:"+discount.getDiscount()*100+"%");
    discount.setSoft(new ProgrammingBook());
    System.out.println("程式設計類折扣:"+discount.getDiscount()*100+"%");
}

輸出結果:

文學類折扣:30.0%
程式設計類折扣:25.0%

總結

策略是一種行為模式,對演算法封裝,使得客戶端獨立於各個策略。

關鍵程式碼實現同一個介面。