亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java策略模式實例應用分析

發布時間:2022-12-08 17:42:03 來源:億速云 閱讀:149 作者:iii 欄目:編程語言

今天小編給大家分享一下Java策略模式實例應用分析的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

編寫鴨子項目,具體要求如下 :

1)有各種鴨子(比如 野鴨、北京鴨、水鴨等)鴨子有各種行為,比如叫、飛行等等。
2)顯示鴨子的信息

傳統方案解決鴨子問題的分析和代碼實現

1)傳統的設計方案(類圖)

Java策略模式實例應用分析

package com.example.demo.dtrategy;

public abstract class Duck {
  
  public Duck() {}
  
  // 顯示鴨子信息
  public abstract void display();
  
  public void quack() {
    System.out.println("鴨子嘎嘎叫~~~");
  }
  
  public void swim() {
    System.out.println("鴨子會游泳~~~");
  }
  
  public void fly() {
    System.out.println("鴨子會飛~~~");
  }

}
package com.example.demo.dtrategy;

public class PekingDuck extends Duck {

  @Override
  public void display() {
    // TODO Auto-generated method stub
    System.out.println("~~ 北京鴨 ~~");
  }
  
  @Override
  public void fly() {
    // TODO Auto-generated method stub
    System.out.println("北京鴨不能飛翔");
  }

}
package com.example.demo.dtrategy;

public class ToyDuck extends Duck {

  @Override
  public void display() {
    // TODO Auto-generated method stub
    System.out.println("玩具鴨");
  }

  //需要重寫父類的所有方法
  public void quack() { 
    System.out.println("玩具鴨不能叫~~");
  }
  public void swim() { 
    System.out.println("玩具鴨不會游泳~~");
  }
  public void fly() { 
    System.out.println("玩具鴨不會飛翔~~~");
  }
}
package com.example.demo.dtrategy;

public class WildDuck extends Duck {

  @Override
  public void display() {
    // TODO Auto-generated method stub
    System.out.println(" 這是野鴨 ");
  }

}

傳統方式解決鴨子問題分析和解決方案

1)其它鴨子,都繼承類Duck類,所以fly讓所有子類都會飛類,這是不正確的。
2)上面說的1的問題,其實是繼承帶來的問題 :對類的局部改動,尤其超類的局部改動,會影響其它部分。會有溢出效應。
3)為了改進1問題,我們可以通過覆蓋fly 方法來解決 - 》覆蓋解決
4)問題又來來,如果我們有一個玩具鴨子ToyDuck,這樣就需要ToyDuck去覆蓋Duck的所有實現的方法 = 》策略模式(strategy pattern)

策略模式基本介紹

1)策略模式(Strategy Pattern)中,定義算法族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化獨立于使用算法的客戶。
2)這算法體現來幾個設計原則,第一、把變化的代碼從不變的代碼中分離出來;第二、針對接口編程而不是具體類(定義來策略接口):第三、多組合/聚合,少用繼承(客戶通過組合方式使用策略)。

策略模式的原理類圖

Java策略模式實例應用分析

說明 :從上圖可以看到,客戶端context 有成員變量 strategy 或者其它的策略接口,至于需要使用到那個策略,我們可以在構造器中指定。

策略模式解決鴨子問題

1)應用實例要求

編寫程序完成前面的鴨子項目,要求使用策略模式

2)類圖

Java策略模式實例應用分析

package com.example.demo.dtrategy.improe;

public interface FlyBehavior {

  void fly(); // 子類具體實現
}
package com.example.demo.dtrategy.improe;

public interface QuackBehavior {

}
package com.example.demo.dtrategy.improe;

public class BadFlyBehavior implements FlyBehavior {

  @Override
  public void fly() {
    // TODO Auto-generated method stub
    System.out.println(" 飛翔技術一般 ");
  }

}
package com.example.demo.dtrategy.improe;

public abstract class Duck {
  
  //屬性, 策略接口
  FlyBehavior flyBehavior; 
  //其它屬性<->策略接口 
  QuackBehavior quackBehavior;

  public Duck() {}
  
  // 顯示鴨子信息
  public abstract void display();
  
  public void quack() {
    System.out.println("鴨子嘎嘎叫~~~");
  }
  
  public void swim() {
    System.out.println("鴨子會游泳~~~");
  }
  
  public void fly() {
    // 改進
    if(flyBehavior != null) {
      flyBehavior.fly();
    }
  }

  public FlyBehavior getFlyBehavior() {
    return flyBehavior;
  }

  public void setFlyBehavior(FlyBehavior flyBehavior) {
    this.flyBehavior = flyBehavior;
  }

  public QuackBehavior getQuackBehavior() {
    return quackBehavior;
  }

  public void setQuackBehavior(QuackBehavior quackBehavior) {
    this.quackBehavior = quackBehavior;
  }
  
  
}
package com.example.demo.dtrategy.improe;

public class GoodFlyBehavior implements FlyBehavior {

  @Override
  public void fly() {
    // TODO Auto-generated method stub
    System.out.println(" 飛翔技術高超 ~~~");
  }

}
package com.example.demo.dtrategy.improe;

public class NoFlyBehavior implements FlyBehavior {

  @Override
  public void fly() {
    // TODO Auto-generated method stub
    System.out.println(" 不會飛翔 ");
  }

}
package com.example.demo.dtrategy.improe;

public class PekingDuck extends Duck {
  
  //假如北京鴨可以飛翔,但是飛翔技術一般 
  public PekingDuck() {
    // TODO Auto-generated constructor stub 
    flyBehavior = new BadFlyBehavior();
  }

  @Override
  public void display() {
    // TODO Auto-generated method stub
    System.out.println("~~北京鴨~~~");
  }

}
package com.example.demo.dtrategy.improe;

public class ToyDuck extends Duck {
  
  public ToyDuck() {
    // TODO Auto-generated constructor stub 
    flyBehavior = new NoFlyBehavior();
  }

  @Override
  public void display() {
    // TODO Auto-generated method stub
    System.out.println("玩具鴨");
  }
  
  //需要重寫父類的所有方法
  public void quack() { 
    System.out.println("玩具鴨不能叫~~");
  }

  public void swim() { 
    System.out.println("玩具鴨不會游泳~~");
  }
}
package com.example.demo.dtrategy.improe;

public class WilDuck extends Duck {
  
  /**
   * 構造器,傳入FlyBehavor 的對象
   */
  public WilDuck() {
    flyBehavior = new GoodFlyBehavior();
  }

  @Override
  public void display() {
    // TODO Auto-generated method stub
    System.out.println(" 這是野鴨 ");
  }

}
package com.example.demo.dtrategy.improe;

public class Client {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    WilDuck wildDuck = new WilDuck(); 
    wildDuck.fly();//
    ToyDuck toyDuck = new ToyDuck(); 
    toyDuck.fly();
    PekingDuck pekingDuck = new PekingDuck(); 
    pekingDuck.fly();
    //動態改變某個對象的行為, 北京鴨 不能飛 
    pekingDuck.setFlyBehavior(new NoFlyBehavior()); 
    System.out.println("北京鴨的實際飛翔能力");
  }

}

策略模式在JDK - Arrays 應用的源碼分析

Java策略模式實例應用分析

說明:

  1. 實現了 Comparator 接口(策略接口) , 匿名類 對象 new Comparator(){…}

  2. 對象 new Comparator(){…} 就是實現了 策略接口 的對象

  3. public int compare(Integer o1, Integer o2){} 指定具體的處理方式

策略模式的注意實現和細節

1)策略模式的關鍵是 :分析項目中變化部分與不變部分
2)策略模式的核心思想是 :多用組合/聚合,少用繼承;用行為類組合,而不是行為的繼承。更有彈性。
3)體現了“開閉原則”。客戶端增加行為不用修改原有代碼,只要添加一種策略(或者行為)即可,避免了使用多重轉移語句(if…else if … else);
4)提供了可以替換繼承關心的辦法 :策略模式將算法封裝在獨立的Strategy類中使得你可以獨立于其Context改變它,使它易于切換、易于理解、易于擴展。
5)需要注意的是 :每添加一個策略就要增加一個類,當策略過多是會導致類數目龐大。

以上就是“Java策略模式實例應用分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

惠东县| 武城县| 福泉市| 安吉县| 利川市| 克东县| 黔南| 大竹县| 青川县| 平武县| 泰州市| 麦盖提县| 石门县| 苍南县| 仁化县| 牙克石市| 胶南市| 普兰县| 克拉玛依市| 界首市| 平乐县| 万盛区| 呈贡县| 安宁市| 万山特区| 丽江市| 平潭县| 南京市| 苏尼特左旗| 南平市| 民和| 乌拉特中旗| 弥勒县| 施秉县| 桂东县| 沈丘县| 闻喜县| 茶陵县| 新晃| 徐汇区| 丁青县|