策略模式

1.策略模式概念

策略模式(Strategy Pattern),實(shí)現(xiàn)一個(gè)類(lèi)的行為或其算法可以在運(yùn)行時(shí)更改。策略模式屬于行為型模式。

2.策略模式作用

定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái), 并且使它們可相互替換。例如,“鴨子叫”這個(gè)行為可以有多種情況。真正的鴨子是“嘎嘎叫”,橡皮鴨是“吱吱叫”,木頭鴨是不會(huì)發(fā)出聲音的。這里就可以給鴨子叫的行為定義一個(gè)interface,給“嘎嘎叫”,“吱吱叫”,不發(fā)出聲音這三種行為分別定義三個(gè)類(lèi)實(shí)現(xiàn)這個(gè)接口。

3.使用場(chǎng)景

1)如果在一個(gè)系統(tǒng)里面有許多類(lèi),它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。
2)一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
3)如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)。

4.優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn):
1)算法可以自由切換。
2)避免使用多重條件判斷。
3)擴(kuò)展性良好。
缺點(diǎn):
1)策略類(lèi)會(huì)增多。
2)所有策略類(lèi)都需要對(duì)外暴露。

5.例子解析

鴨子例子使用策略模式類(lèi)圖

策略接口

public interface QuackBehavior {
    public void quack();
}

策略對(duì)象一:吱吱叫行為

public class ZZQuack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("吱吱叫");
    }
}

策略對(duì)象二:呱呱叫行為

public class GGQuack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("嘎嘎叫");
    }
}

策略對(duì)象三:不發(fā)出聲音

public class NoQuack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("不發(fā)出聲音");
    }
}

配置類(lèi):

public class Duck {
    private QuackBehavior quackBehavior = null;
    public Duck(String what) {
        System.out.printf(what);
    }
    
    public void performQuack()
    {
        if (quackBehavior!=null) {
            quackBehavior.quack();
        }
    }
    
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

客戶(hù)端

public class Test {

    public static void main(String[] args) {
        Duck whiteDuck = new Duck("白鴨子");
        whiteDuck.setQuackBehavior(new GGQuack());
        whiteDuck.performQuack();
        Duck rubberDuck = new Duck("橡皮鴨子");
        rubberDuck.setQuackBehavior(new ZZQuack());
        rubberDuck.performQuack();
        Duck woodDuck = new Duck("木頭鴨子");
        woodDuck.setQuackBehavior(new NoQuack());
        woodDuck.performQuack();
    }
}

6.總結(jié)
1)多用組合,少用繼承。其實(shí)設(shè)計(jì)模式只是提供給我們一個(gè)概念,規(guī)范代碼,便于后期維護(hù),很多時(shí)候我們要視情況而定。這里的組合又是什么意思?組合是一種“has-a”的關(guān)系。簡(jiǎn)單的說(shuō)就是一個(gè)類(lèi)里面擁有另一個(gè)類(lèi)的引用。這時(shí)候可以說(shuō)“Class A has a Class B”,如圖

組合展示圖

該類(lèi)圖對(duì)應(yīng)的代碼如下:

public abstract class Duck {

    IFlyBebavior flyBebavior;
    IQuackBehavior iQuackBehavior;

    public Duck() {
    }
    public void performFly()
    {
        flyBebavior.fly();
    }
    
    public void performQuack()
    {
        iQuackBehavior.quack();
    }
    
    public void swim()
    {
        System.out.println("在游泳");
    }
    public void display()
    {
        System.out.print("外觀");
    }
    public void setFlyBebavior(IFlyBebavior flyBebavior) {
        this.flyBebavior = flyBebavior;
    }
    public void setiQuackBehavior(IQuackBehavior iQuackBehavior) {
        this.iQuackBehavior = iQuackBehavior;
    }
}

這里的"飛行為IFlyBebavior "和"叫行為IQuackBehavior "同時(shí)被這個(gè)Duck類(lèi)持有,也就是說(shuō)"Class Duck has IFlyBebavior "和"Class Duck has IQuackBehavior "都是一種組合行為。

7.源碼地址

http://download.csdn.net/detail/lgywsdy/9748210

8.參考文章

http://www.runoob.com/design-pattern/strategy-pattern.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 報(bào)價(jià)管理## 向客戶(hù)報(bào)價(jià),對(duì)于銷(xiāo)售部門(mén)的人來(lái)講,這是一個(gè)非常重大、非常復(fù)雜的問(wèn)題,對(duì)不同的...
    七寸知架構(gòu)閱讀 5,133評(píng)論 9 62
  • title: 策略模式date: 2016-07-18 21:10:26tags: 編程categories: 設(shè)...
    風(fēng)水里游閱讀 297評(píng)論 0 0
  • 1 場(chǎng)景問(wèn)題 1.1 報(bào)價(jià)管理 向客戶(hù)報(bào)價(jià),對(duì)于銷(xiāo)售部門(mén)的人來(lái)講,這是一個(gè)非常重大、非常復(fù)雜的問(wèn)題,對(duì)不同的客戶(hù)要...
    4e70992f13e7閱讀 3,128評(píng)論 2 16
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,973評(píng)論 19 139
  • 昨晚躺在床上一不小心睡著了,補(bǔ)上。 昨天讀的是《啟問(wèn)道通書(shū)》,道通也是先生的學(xué)生。 我們?cè)谛奚硇扌臅r(shí),可以自修,也...
    鑲潤(rùn)_讀書(shū)閱讀 435評(píng)論 0 0