行為型(一) 策略模式

2021-08-20 19:23:55 字數 2105 閱讀 1872

1、定義

define a family of algorithms, encapsulate each one, and make them interchangeable.

定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。

2、使用場景

多個類只是在演算法或行為上稍有不同

演算法需要自由切換

需要遮蔽演算法規則

3、uml類圖

角色說明:

上下文context: 遮蔽高層模組對策略、演算法的直接訪問,它持有乙個strategy類的引用

抽象策略strategy:對策略、演算法進行抽象、

concretestrategya、concretestrategyb:是實現抽象策略中的具體操作,具體演算法。

4、示例

以圖書館售書折扣為例,存在以下三種折扣演算法:

演算法1:對有些圖書沒有折扣,即折扣值演算法中折扣值為0

演算法2:對有些圖書的折扣值是固定值為1元

演算法3:對有些圖書的折扣是15%

/**

* 抽象折扣演算法

* @author administrator

* */

public abstract class strategy

public double getprice()

public int getnumber()

// 策略演算法,計算折扣額

public abstract double calculatediscount();

}

/**

* 具體折扣類,沒有折扣演算法

* @author administrator

* */

public class nodiscountstrategy extends strategy

/*** 實現策略演算法,0折扣演算法

*/@override

public double calculatediscount()

}

/**

* 具體折扣類,固定折扣值為1的演算法

* @author administrator

* */

public class fixdiscountstrategy extends strategy

/*** 實現策略演算法,固定的折扣額

*/@override

public double calculatediscount()

}

/**

* 具體的折扣,按照15%的折扣演算法

* @author administrator

* */

public class percentagediscountstrategy extends strategy

/*** 具體策略演算法,15%的折扣額

*/@override

public double calculatediscount()

}

/**

* 上下文文context的實現

* @author administrator

* */

public class contextclient

/*** 呼叫策略演算法,計算折扣值

* @return

*/public double caldiscount()

public static void main(string args)

}

輸出結果如下:

0折扣:0.0

固定折扣:40.0

15%折扣:145.5

5、總結

優點:定義了乙個演算法和行為族,恰當的使用繼承將公共的**移到父類中,避免**重複。

避免使用多重條件判斷。

缺點:客戶端必須知道所有的策略類,並自行決定使用哪個策略類。

隨著策略的增加,子類也會變得繁多。

策略模式(行為型)

思考問題 乙個書店的某類書是免費的,某類書是固定1元的,某類書是按折扣算的 比如88 同一類別的書本 一樣 假定顧客只買一類書,在設計書店bookstore類時應該如何計算顧客買書的費用?解答 1.你有可能不知道如何設計,畢竟上面的計算規則不一樣 並不是一類書8折另一類書9折那樣好計算 2.既然這樣...

行為型 策略模式

注入物件,改變行為。這是乙個很有意思的模式,它可以有多種表現形式,只要滿足注入物件,改變行為。學習這個模式,必須忘記網上和書上的標準類圖。注入不同的comparator,排序的方式也不同。這是最常見的策略模式的表現形式,沒必要畫什麼圖。與上乙個策略模式比較,有點主客顛倒的意思。class beanc...

設計模式 行為型 策略模式

更好的實現開閉原則 ocp,openclosedprinciple 即對於擴充套件是開放的,對於修改是關閉的,不修改原有 只擴充套件 策略模式包括三個角色 context 環境類 使用演算法策略,維持乙個抽象策略類的引用例項 strategy 抽象策略類 將所有的策略抽象出來,在該類宣告抽象方法或者...