舉例說(shuō)明:
/**
* 作者:wanglei
* 郵箱:229846388@qq.com
* 策略模式
* 義抽象策略角色(Strategy):百貨公司所有促銷(xiāo)活動(dòng)的共同接口
*/
public abstract class Strategy {
public abstract void show();
}
/**
* 作者:wanglei
* 郵箱:229846388@qq.com
* 策略模式
* 定義具體策略角色(Concrete Strategy):每個(gè)節(jié)日具體的促銷(xiāo)活動(dòng)
*/
public class StrategyA extends Strategy{
//為春節(jié)準(zhǔn)備的促銷(xiāo)活動(dòng)A
@Override
public void show() {
System.out.println("為春節(jié)準(zhǔn)備的促銷(xiāo)活動(dòng)A");
}
}
/**
* 作者:wanglei
* 郵箱:229846388@qq.com
* 策略模式
* 定義具體策略角色(Concrete Strategy):每個(gè)節(jié)日具體的促銷(xiāo)活動(dòng)
*/
public class StrategyB extends Strategy {
//為春節(jié)準(zhǔn)備的促銷(xiāo)活動(dòng)B
@Override
public void show() {
System.out.println("為春節(jié)準(zhǔn)備的促銷(xiāo)活動(dòng)B");
}
}
/**
* 作者:wanglei
* 郵箱:229846388@qq.com
* 策略模式
* 定義具體策略角色(Concrete Strategy):每個(gè)節(jié)日具體的促銷(xiāo)活動(dòng)
*/
public class StrategyC extends Strategy {
//為春節(jié)準(zhǔn)備的促銷(xiāo)活動(dòng)C
@Override
public void show() {
System.out.println("為春節(jié)準(zhǔn)備的促銷(xiāo)活動(dòng)C");
}
}
/**
* 作者:wanglei
* 郵箱:229846388@qq.com
* 策略模式
* 定義環(huán)境角色(Context):用于連接上下文相速,即把促銷(xiāo)活動(dòng)推銷(xiāo)給客戶(hù)奥务,這里可以理解為銷(xiāo)售員
*/
public class Context_SalesMan {
//持有抽象策略角色的引用
private Strategy strategy;
//生成銷(xiāo)售員實(shí)例時(shí)告訴銷(xiāo)售員什么節(jié)日(構(gòu)造方法)
//使得讓銷(xiāo)售員根據(jù)傳入的參數(shù)(節(jié)日)選擇促銷(xiāo)活動(dòng)(這里使用一個(gè)簡(jiǎn)單的工廠模式)
public Context_SalesMan(String festival){
switch (festival){
case "A":
strategy = new StrategyA();
break;
case "B":
strategy = new StrategyB();
break;
case "C":
strategy = new StrategyC();
break;
default:
break;
}
}
/**
* 向客戶(hù)展示促銷(xiāo)活動(dòng)
*/
public void SalesManShow(){
strategy.show();
}
}
/**
* 作者:wanglei
* 郵箱:229846388@qq.com
* 策略模式
* 定義:
* 1.定義一系列算法蚕冬,將每個(gè)算法封裝到具有公共接口的一系列策略類(lèi)中,從而使它們可以相互替換蓄坏,并讓算法可以在不影響到客戶(hù)端的情況下發(fā)生變化。
* 2.簡(jiǎn)單來(lái)說(shuō),就是“準(zhǔn)備一組算法,并將每一個(gè)算法封裝起來(lái)窗宦,使得它們可以互換”
* 作用(解決的問(wèn)題):
* 1.使得客戶(hù)端可以根據(jù)外部條件選擇不同策略來(lái)解決不同問(wèn)題
* 2.策略模式僅僅封裝算法(包括添加 & 刪除),但策略模式并不決定在何時(shí)使用何種算法二鳄,算法的選擇由客戶(hù)端來(lái)決定
* 3.將算法的責(zé)任和本身進(jìn)行解耦對(duì)算法進(jìn)行封裝赴涵,將算法的責(zé)任和算法本身分割開(kāi),委派給不同的對(duì)象管理泥从。
* 4.讓算法和對(duì)象分開(kāi)來(lái),使得算法可以獨(dú)立于使用它的客戶(hù)而變化
* 實(shí)例講解:
* a. 實(shí)例概況
* 背景:小成有一家百貨公司沪摄,最近在定年度的促銷(xiāo)活動(dòng)
* 沖突:每個(gè)節(jié)日用同一個(gè)促銷(xiāo)活動(dòng)太枯燥躯嫉,沒(méi)吸引力
* 解決方案:針對(duì)不同節(jié)目使用不同促銷(xiāo)活動(dòng)進(jìn)行促銷(xiāo)
*/
public class SimplePattern {
public static void main(String[] args) {
Context_SalesMan salesMan;
salesMan = new Context_SalesMan("A");
salesMan.SalesManShow();
salesMan = new Context_SalesMan("B");
salesMan.SalesManShow();
salesMan = new Context_SalesMan("C");
salesMan.SalesManShow();
}
}
/**
* 結(jié)果:
* 為春節(jié)準(zhǔn)備的促銷(xiāo)活動(dòng)A
* 為春節(jié)準(zhǔn)備的促銷(xiāo)活動(dòng)B
* 為春節(jié)準(zhǔn)備的促銷(xiāo)活動(dòng)C
* 優(yōu)點(diǎn):
* 1.策略類(lèi)之間可以自由切換由于策略類(lèi)都實(shí)現(xiàn)同一個(gè)接口,所以使它們之間可以自由切換杨拐。
* 2.易于擴(kuò)展增加一個(gè)新的策略只需要添加一個(gè)具體的策略類(lèi)即可祈餐,基本不需要改變?cè)械拇a,符合“開(kāi)閉原則“
* 3.避免使用多重條件選擇語(yǔ)句(if else)哄陶,充分體現(xiàn)面向?qū)ο笤O(shè)計(jì)思想帆阳。
* 缺點(diǎn):
* 1.客戶(hù)端必須知道所有的策略類(lèi),并自行決定使用哪一個(gè)策略類(lèi)屋吨。
* 2.策略模式將造成產(chǎn)生很多策略類(lèi)蜒谤,可以通過(guò)使用享元模式在一定程度上減少對(duì)象的數(shù)量。
* 應(yīng)用場(chǎng)景:
* 1.一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種的情況
* 2.如果在一個(gè)系統(tǒng)里面有許多類(lèi)至扰,它們之間的區(qū)別僅在于它們的行為鳍徽,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為
* 3.如果一個(gè)對(duì)象有很多的行為,如果不使用合適的模式敢课,這些行為就只好使用多重的if-else語(yǔ)句來(lái)實(shí)現(xiàn)阶祭,此時(shí),可以使用策略模式直秆,把這些行為轉(zhuǎn)移到相應(yīng)的具體策略類(lèi)里面濒募,就可以避免使用難以維護(hù)的多重條件選擇語(yǔ)句,并體現(xiàn)面向?qū)ο笊婕暗母拍睢? * 4.不希望客戶(hù)端知道復(fù)雜的圾结、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)瑰剃,在具體策略類(lèi)中封裝算法和相關(guān)的數(shù)據(jù)結(jié)構(gòu),提高算法的保密性與安全性筝野。
*/
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者