成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java設(shè)計(jì)模式之策略模式詳解

DevTalking / 781人閱讀

摘要:下面我們就來(lái)介紹怎么用策略模式來(lái)解決這個(gè)問(wèn)題。結(jié)果很快的跳很快的跑紅藍(lán)相間的超人狗不會(huì)跳不會(huì)跑紅藍(lán)相間的超人狗總結(jié)策略模式就是把所有的可變的行為都抽取出來(lái)放到接口中,然后定義很多的行為類去實(shí)現(xiàn)接口。

策略模式就是定義了一系列的的算法,將它們都多帶帶封裝起來(lái),讓他們之間可以相互替換,可以讓算法的變化獨(dú)立于使用算法的客戶。

首先創(chuàng)建一個(gè)Dog父類,有run方法控制跑,jump方法控制跳,color方法控制顏色。

public class Dog {
    public void run(){
        System.out.println("狗在跑");
    }

    public void jump(){
        System.out.println("狗在跳");
    }

    public void color(){
    }
}

創(chuàng)建兩個(gè)子類,分別是WhiteDog和BlackDog,都重寫了父類的color方法,運(yùn)行一下。

public class WhiteDog extends Dog {

    @Override
    public void color() {
        System.out.println("白顏色的狗");
    }
}

public class BlackDog extends Dog {

    @Override
    public void color() {
        System.out.println("黑顏色的狗");
    }
}

public class Test {
    public static void main(String[] args){
        WhiteDog whiteDog = new WhiteDog();
        whiteDog.run();
        whiteDog.jump();
        whiteDog.color();
        BlackDog blackDog = new BlackDog();
        blackDog.run();
        blackDog.jump();
        blackDog.color();
    }
}

結(jié)果:
狗在跑
狗在跳
白顏色的狗
狗在跑
狗在跳
黑顏色的狗

這個(gè)時(shí)候看上去好像很完美沒(méi)有任何問(wèn)題,但是有一天我們又新建了一個(gè)公仔狗的對(duì)象Doll dog,這個(gè)時(shí)候我們發(fā)現(xiàn)好像有點(diǎn)不對(duì),公仔狗是不會(huì)跳也不會(huì)跑的??梢匀绻^承了Dog父類他就自帶跑和跳的功能了,那就不對(duì)了。
public class DollDog extends Dog {

@Override
public void color() {
    System.out.println("五顏六色");
}

}

DollDog dollDog = new DollDog();
dollDog.run();
dollDog.jump();
dollDog.color();

結(jié)果:
狗在跑
狗在跳
五顏六色的玩具狗

這個(gè)時(shí)候我們靈機(jī)一動(dòng)想到可以讓子類覆蓋父類run方法和jump方法,讓DollDog中的跑和跳功能失效,我們?cè)龠\(yùn)行一下。

@Override
public void run() {
    System.out.println("玩具狗不會(huì)跑");
}

@Override
public void jump() {
    System.out.println("玩具狗不會(huì)跳");
}

結(jié)果:
玩具狗不會(huì)跑
玩具狗不會(huì)跳
五顏六色的玩具狗

看起來(lái)是解決了問(wèn)題,但是如果一天要增加100個(gè)各種各樣的狗的話難道我們要讓100個(gè)新建的子類都重寫父類的方法嗎?這個(gè)時(shí)候父類里面還只有3個(gè)方法,如果是30個(gè)呢?如果我們都靠子類重寫的話那效率該多低呢?有沒(méi)有別的方法來(lái)解決呢?答案是肯定的。下面我們就來(lái)介紹怎么用策略模式來(lái)解決這個(gè)問(wèn)題。
首先我們要知道設(shè)計(jì)模式中第一個(gè)原則,要把代碼中經(jīng)常需要修改的部分獨(dú)立抽取出來(lái),不要和其他代碼混在一起,這樣更便于我們擴(kuò)展要修改的部分 。目前來(lái)看最常變化的是run和jump方法。所以我們可以將這兩個(gè)方法抽取出來(lái),這里就要說(shuō)到設(shè)計(jì)模式中第二個(gè)原則,針對(duì)接口編程,而不是現(xiàn)實(shí)編程。比如run和jump有不同的種類,我們可以聲明一個(gè)接口里面定義run和jump方法,然后創(chuàng)建許多類去實(shí)現(xiàn),調(diào)用的時(shí)候動(dòng)態(tài)選擇類型。這種類被稱為行為類。行為類中的代碼可以進(jìn)行復(fù)用,卻不會(huì)有繼承帶來(lái)的那些麻煩。

定義方法的接口:

public interface RunBehavior {
    void run();
}

public interface JumpBehavior {
    void jump();
}

實(shí)現(xiàn)方法的行為類:

public class RunNoWay implements RunBehavior {
    @Override
    public void run() {
        System.out.println("不會(huì)跑");
    }
}

public class RunFast implements RunBehavior {
    @Override
    public void run() {
        System.out.println("很快的跑");
    }
}

public class RunSlow implements RunBehavior {
    @Override
    public void run() {
        System.out.println("很慢的跑");
    }
}

public class JumpNoWay implements JumpBehavior {
    @Override
    public void jump() {
        System.out.println("不會(huì)跳");
    }
}

public class JumpFast implements JumpBehavior {
    @Override
    public void jump() {
        System.out.println("很快的跳");
    }
}

現(xiàn)在我們將變化的部分抽取出來(lái)了,所以Dog父類就會(huì)把run和jump的操作委托給行為類處理,那么具體要怎么使用這些行為類?這里就需要在Dog父類中定義兩個(gè)實(shí)例變量,聲明類型為RunBehavior和JumpBehavior,所以在代碼運(yùn)行的時(shí)候會(huì)用多態(tài)的方式引用正確的類型。然后在父類中的run和jump方法中委托行為類去執(zhí)行功能。

public class Dog {
    public RunBehavior runBehavior;
    public JumpBehavior jumpBehavior;

    public void run(){
        runBehavior.run();
    }

    public void jump(){
        jumpBehavior.jump();
    }

    public void color(){
    }
}

最后當(dāng)我們沒(méi)出現(xiàn)一個(gè)新的類型的狗狗的時(shí)候,我們?yōu)樗鼊?chuàng)建一個(gè)新類然后繼承Dog父類,然后我們?cè)谧宇惖臉?gòu)造方法中獲取父類中兩個(gè)接口的引用,根據(jù)自己的需要通過(guò)多態(tài)指定不同的行為類。

public class SuperDog extends Dog {

    public SuperDog(){
        runBehavior = new RunFast();
        jumpBehavior = new JumpFast();
    }

    @Override
    public void color() {
        System.out.println("紅藍(lán)相間的超人狗");
    }
}

Dog dog = new SuperDog();
dog.jump();
dog.run();
dog.color();

結(jié)果:
很快的跳
很快的跑
紅藍(lán)相間的超人狗

最后我們還有一個(gè)小問(wèn)題,每次指定選擇類的時(shí)候都是在子類的構(gòu)造方法中指定,可不可以動(dòng)態(tài)的指定呢?當(dāng)然可以,我們只需要為聲明的接口引用添加兩個(gè)set方法。然后在外部調(diào)用即可。

public void setRunBehavior(RunBehavior runBehavior) {
    this.runBehavior = runBehavior;
}

public void setJumpBehavior(JumpBehavior jumpBehavior) {
    this.jumpBehavior = jumpBehavior;
}

Dog dog = new SuperDog();
dog.jump();
dog.run();
dog.color();

dog.setJumpBehavior(new JumpNoWay());
dog.setRunBehavior(new RunNoWay());
dog.jump();
dog.run();
dog.color();

結(jié)果:
很快的跳
很快的跑
紅藍(lán)相間的超人狗
不會(huì)跳
不會(huì)跑
紅藍(lán)相間的超人狗

總結(jié):
策略模式就是把所有的可變的行為都抽取出來(lái)放到接口中,然后定義很多的行為類去實(shí)現(xiàn)接口。在父類中聲明了接口的引用利用多態(tài)去動(dòng)態(tài)的選擇自己需要的行為類,避免了以前因?yàn)閱渭兊睦^承造成的每次的新變動(dòng)都需要寫大量的重復(fù)代碼,而現(xiàn)在只需要定義好行為類進(jìn)行復(fù)用即可,不需要修改原本的代碼。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69045.html

相關(guān)文章

  • 后臺(tái)開(kāi)發(fā)常問(wèn)面試題集錦(問(wèn)題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問(wèn)題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問(wèn)題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    spacewander 評(píng)論0 收藏0
  • 后臺(tái)開(kāi)發(fā)常問(wèn)面試題集錦(問(wèn)題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問(wèn)題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問(wèn)題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    xfee 評(píng)論0 收藏0
  • 后臺(tái)開(kāi)發(fā)常問(wèn)面試題集錦(問(wèn)題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問(wèn)題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問(wèn)題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    makeFoxPlay 評(píng)論0 收藏0
  • 后端ing

    摘要:當(dāng)活動(dòng)線程核心線程非核心線程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來(lái)進(jìn)行拒絕策略處理。線程池工作原則當(dāng)線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請(qǐng)求。當(dāng)線程池中的數(shù)量等于最大線程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...

    roadtogeek 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

DevTalking

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<