設計模式之Strategy模式

策略模式屬於對象的行爲模式。其用意是針對一組算法,將每個算法封裝到具體的共同接口的獨立類中,從而使得他們能夠互相替換。算法

策略模式使得算法能夠在不影響客戶端的狀況下發生變化。函數

all in one 「準備一組算法,並將每個算法封裝起來,使得它們能夠互換」。this

三個角色:spa

環境context角色:持有一個Strategy的引用code

策略接口角色:這是一個抽象角色,一般由一個接口或抽象類實現。此角色給出全部的具體策略類所需的接口。對象

策略角色:包裝了相關的算法或行爲blog

 

環境角色:接口

package com.yzf.pattern.strategy;

/**
 * 策略模式的重心不是如何實現算法,而是如何組織、調用這些算法,從而讓程序結構更靈活,具備更好的維護性和擴展性。
 * 在每個時刻只能使用一個具體的策略實現對象
 * @author luozuzu
 *
 */
public class Price {
    //持有一個具體的策略對象
    private MemberStrategy memberStrategy;
    
    /**
     * 構造函數,傳入一個具體的策略對象
     * @param memberStrategy
     */
    public Price( MemberStrategy memberStrategy){
        this.memberStrategy = memberStrategy;
    }
    
    public double quote(double price){
        return this.memberStrategy.calcPrice(price);
    }
}

接口類:class

package com.yzf.pattern.strategy;

//策略接口
public interface MemberStrategy {
    public double calcPrice(double price);
}

策略實現類擴展

package com.yzf.pattern.strategy;

public class FirstMemberStrategy implements MemberStrategy {
    
    //具體策略算法1
    public double calcPrice(double price) {
         
        System.out.println("對於初級會員的沒有折扣");
        
        return price;
    }

}
package com.yzf.pattern.strategy;

public class SecondMemberStrategy implements MemberStrategy {
    //具體策略算法2
    public double calcPrice(double price) {
        System.out.println("對於中級會員的折扣爲10%");
        return price * 0.9;
    }

}
package com.yzf.pattern.strategy;

public class ThirdMemberStrategy  implements MemberStrategy {
    
    //具體策略算法3
    public double calcPrice(double price) {
         System.out.println("對於高級會員的折扣爲20%");
         return price * 0.8;
    }
}

客戶端

package com.yzf.pattern.strategy;

public class Client {

    public static void main(String[] args) {
        //MemberStrategy ms = new FirstMemberStrategy();
        
        //MemberStrategy ms = new FirstMemberStrategy();
        
        MemberStrategy ms = new SecondMemberStrategy();
        Price p = new Price(ms);
        double quote = p.quote(300);
        System.out.println(quote);
    }

}

  策略模式的重心不是如何實現算法,而是如何組織、調用這些算法,從而讓程序結構更靈活,具備更好的維護性和擴展性。

相關文章
相關標籤/搜索