1. 程式人生 > >java設計模式-策略模式一

java設計模式-策略模式一

一,定義:Strategy模式也叫策略模式是行為模式的一種,它對一系列的演算法加以封裝,為所有的演算法定義一個抽象的演算法介面,並通過繼承該抽象演算法介面對所有的演算法加以封裝和實現,具體的演算法選擇交有客戶端決定(策略)。Strategy模式主要有外部環境來決定演算法的切換。

二,結構:

  • 封裝類:也叫上下文,對策略進行二次封裝,目的是避免高層模組對策略的直接呼叫。
  • 抽象策略:通常情況下為一個介面,當各個實現類中存在著重複的邏輯時,則使用抽象類來封裝這部分公共的程式碼,此時,策略模式看上去更像是模版方法模式。
  • 具體策略:具體策略角色通常由一組封裝了演算法的類來擔任,這些類之間可以根據需要自由替換。

三,演示:

抽象策略

public interface IStrategy {

    public int cost(double money);
}

具體策略類

public class ProductA implements IStrategy {
    //商品A如果是購買的商品A,滿100元10元。
    @Override
    public double cost(double money) {
        System.out.println("我在購買商品A");
        if(money>100){
           return money-10;
        }
        return money;
    }
}
public class ProductB implements IStrategy {
    //商品B如果是購買的商品B,滿100元0.85折。
    @Override
    public double cost(double money) {
        System.out.println("我在購買商品B");
        if(money>100){
           return money*0.85;
        }
        return money;
    }
}

封裝類

public class Context {

    private IStrategy strategy;
    public Context(IStrategy strategy) {
        this.strategy = strategy;
    }

    public double cost(double money) {

        return this.strategy.cost(money);
    }
}

客戶端呼叫:

public class MainClass {
    public static void main(String[] args){
        Context s=new Context(new ProductA());
        double cost = s.cost(120);
        System.out.println("實際花費:"+cost);
        Context s1=new Context(new ProductB());
        double cost1 = s1.cost(120);
        System.out.println("實際花費:"+cost1);
    }
}

策略模式缺點:

1. 客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味著客戶端必須理解這些演算法的區別,以便適時選擇恰當的演算法類。換言之,策略模式只適用於客戶端知道所有的演算法或行為的情況。

2. 策略模式造成很多的策略類。有時候可以通過把依賴於環境的狀態儲存到客戶端裡面,而將策略類設計成可共享的,這樣策略類例項可以被不同客戶端使用。換言之,可以使用享元模式來減少物件的數量。

總結:策略設計模式是有外部來確定具體的策略類的演算法邏輯,例如常見的泛型ArrayList<T>就是策略設計模式(不夠嚴謹僅供理解),由外部呼叫者確定。