国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

策略模式總結

lifesimple / 1555人閱讀

摘要:根據教案寫出的代碼事例接口接口行為的一個實現行為的又另一個實現父類的一個子類綠頭鴨的另一個子類模型鴨方法總結。策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶,這是書里給出的策略模式的定義。

1、事例的背景基礎:

做一套模擬鴨子的游戲,游戲中會出現各種鴨子,一邊游泳戲水,一邊呱呱叫,還有一些會飛。主要是根據鴨子這一對象的飛行行為和叫聲行為為基礎,當客戶提出不同的要求時,如何能夠在滿足不同的要求的同時,使得之前的功能正常運行,未來的功能能夠靈活適用。

2、講解的過程:分別提供了多種方案,即就是我們通常能夠想到的,繼承、接口的方案。雖然通過這些方案都可以解決當前的問題,但是對于系統的彈性和代碼的未來適用性都不能夠滿足需求。
2.1 繼承方案:

設計一個超類Duck,包含方法quack()、swim()、fly()分別模擬鴨子的叫、游泳、飛行等行為,再包含一個抽象類display(),用于展示各個鴨子不同的外觀,讓每個鴨子子類繼承父類時實現display()。
優點:每個鴨子子類繼承父類時就同時擁有了父類的方法,可以達到代碼復用的目的。
缺點:這樣會使某些并不適合該行為的子類也具有該行為。如果某些子類鴨子,如“橡皮鴨”,它不具備某些功能(如飛行),它就不應該擁有這個飛行的功能。當然,你可以在子類中通過@Override覆蓋這個方法。但是當各個不同的子類都需要通過覆蓋修改不同的方法時,就會非常繁瑣,而且容易出現紕漏,且這些新覆蓋的方法不能被復用。如“橡皮鴨”只會叫不會飛,“木頭鴨”不會叫也不會飛。以后每當有新的鴨子子類出現,我們都要去檢查并可能需要覆蓋這些方法,然后根據不同的需求做出不同的改進。這是不符合靈活適用的目的的。

2.2 接口方案

在超類Duck中將quack()、fly()等可變的方法用接口Quackable(),Flyable()來代替,然后在每個鴨子子類中,如果具有“飛行”或“叫”這個功能就實現“飛行“或”叫“這個接口。
優點:可以暫時解決眼前的困難。
缺點:代碼無法復用,如果有N個子類,都具有飛行的行為,就需要重復N次代碼。這對于開發人員和產品本身都是不符合要求的。

2.3 引入設計模式
2.3.1設計模式的原則

1、找出程序中可能需要變化的地方和不需要變化的地方,將它們獨立開來。讓系統中的某部分改變不會影響其他部分。
2、針對接口編程,而不是針對實現。利用多態,針對超類型編程,執行時根據實際狀況執行到真正的行為,不會被綁死在超類型的行為上。以前的做法是:行為來自超類的具體實現或是繼承某個接口并由子類自行實現。這兩種方法都捆綁于”實現“,無法方便地更改行為。現在我們利用接口代表每個行為,比如FlyBehavior,QuackBehavior,然后讓各個行為類實現這些接口,然后在Duck類中只要定義這個接口的實例變量即可,這樣在各個鴨子子類中如果想擁有某種特定的行為,只要用這個接口實例變量去引用具體的行為類即可。
3、多用組合,少用繼承。飛行和叫這兩種不同的行為,我們分別為其建立兩組不同的行為類,然后在Duck類中通過接口實例變量結合起來,這就是”組合“。使得系統具有很大的彈性。

2.3.2根據教案寫出的代碼事例:

1、接口FlyBehavior
public interface FlyBehavior {
    public void fly();
 }
2、接口QuackBehavior
public interface QuackBehavior {
 public void quack();
 }
3、Fly行為的一個實現——FlyNoWay
public class FlyNoWay implements FlyBehavior{
    @Override
        public void fly() {
        System.out.println("I can not fly.");
    }
}
 4、public class FlyWithWings implements FlyBehavior {
     @Override
        public void fly() {
         System.out.println("I can fly!");
     }
 }
5、Fly行為的又另一個實現——FlyRocketPowered 
 public class FlyRocketPowered implements FlyBehavior{
     @Override
     public void fly() {
        System.out.println("I am flying with a rocket.");
     }
    }
6、父類Duck
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public abstract void display();
public void performFly(){
    flyBehavior.fly();
}
public void performQuack(){
    quackBehavior.quack();
}
public void setFlyBehavior(FlyBehavior fb){
    this.flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb){
    this.quackBehavior=qb;
}
}
Duck的一個子類——綠頭鴨MallardDuck
public class MallardDuck extends Duck{
public MallardDuck() {
    flyBehavior = new FlyWithWings();
    quackBehavior = new QuackWithGuaGua();
}

@Override
public void display() {
    System.out.println("I am a MallardDuck.");
    
}
}
Duck的另一個子類——模型鴨ModelDuck
public class ModelDuck extends Duck {
public ModelDuck() {
    flyBehavior = new FlyNoWay();
    quackBehavior = new QuackNoWay();
}

@Override
public void display() {
    System.out.println("I am a ModelDuck.");        
}
}
main方法:MiniDuckSimulator
public class MiniDuckSimulator {

public static void main(String[] args) {
    Duck mallardDuck = new MallardDuck();
    mallardDuck.display();
    mallardDuck.performFly();
    mallardDuck.performQuack();
    Duck modelDuck = new ModelDuck();
    modelDuck.display();
    modelDuck.performFly();
    modelDuck.performQuack();
    modelDuck.setFlyBehavior(new FlyRocketPowered());
    modelDuck.performFly();
}

}

3、總結。

 策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶,這是書里給出的策略模式的定義。個人的理解:就是我們要把一些對象的可變的行為抽象出來,多帶帶進行封裝,用一組行為類(算法族)來實現該特定的接口,這樣任何類(如Duck)如果想擁有這些算法族中的某個算法,都可以通過定義接口實例變量而擁有該整個算法族,在子類中再對該變量進行賦值。像這個例子里,通過定義了FlyBehavior,這樣以后任何想有飛行行為的類如飛機,都可以調用這個接口及實現它的各個飛行類。且飛行行為的變化可以通過增加新的飛行類來實現,不會對其他部分(如quack()、display()等行為,亦或是已擁有某些特定飛行行為的對象)造成任何影響,即”算法的變化獨立于使用算法的客戶“。而且各個飛行行為之間也可以互相替換。即 setFlyBehavior(Flybehavior fb)。通過這種方式,能夠使代碼的復用性很強,又可以解決各種多變的需求。
通過這樣的學習一遍策略模式,雖然對于策略模式有了一定的理解,但是想要靈活的運用在開發的過程中,還是需要多多的練習和體會。

注:本文的事例和解析思路來源于內容來源于《Heard First 設計模式》一書

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77313.html

相關文章

  • 慕課網_《模式的秘密之策略模式》學習總結

    時間:2017年08月31日星期四說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:策略模式簡介 1-1 簡介 課程大綱 什么是策略模式 策略模式如何實現 策略模式總結篇 實例案例分享 日常生活中的策略 Wor...

    zhongmeizhi 評論0 收藏0
  • 前端也要學系列:設計模式策略模式

    摘要:做前端開發已經好幾年了,對設計模式一直沒有深入學習總結過。今天第一天,首先來講策略模式。什么是策略模式四兄弟的經典設計模式中,對策略模式的定義如下定義一系列的算法,把它們一個個封裝起來,并且使它們可互相替換。 做前端開發已經好幾年了,對設計模式一直沒有深入學習總結過。隨著架構相關的工作越來越多,越來越能感覺到設計模式成為了我前進道路上的一個阻礙。所以從今天開始深入學習和總結經典的設計模...

    Anchorer 評論0 收藏0
  • php設計模式

    摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...

    Dionysus_go 評論0 收藏0
  • php設計模式

    摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...

    vspiders 評論0 收藏0
  • JavaScript設計模式與開發實踐系列之策略模式

    摘要:本系列為設計模式與開發實踐作者曾探學習總結,如想深入了解,請支持作者原版策略模式策略模式的定義定義一系列的算法,把它們一個個封裝起來,并且使它們可以互相替換。 本系列為《JavaScript設計模式與開發實踐》(作者:曾探)學習總結,如想深入了解,請支持作者原版 策略模式 策略模式的定義:定義一系列的算法,把它們一個個封裝起來,并且使它們可以互相替換。 舉個形象的例子,使用策略模式計算...

    spademan 評論0 收藏0

發表評論

0條評論

lifesimple

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<