【策略模式應用場景舉例】
比如在玩“極品飛車”這款遊戲,那麼遊戲對車的輪胎是可以更換的,不同的輪胎在高速轉彎時有不同的痕跡樣式,那麼針對“汽車”的配件“輪胎”就要可以變化,而且輪胎和輪胎之間是可以相互替換的,這就是典型的要應用“策略模式”的場景!從程序結構中可以看到,完全符合了前面我們的要求:“靈活”,“順序敏感”。
【策略模式解釋】
類型:行爲模式
定義一組算法,將每個算法都封裝起來,並且使它們之間可以互換。策略模式使這些算法在客戶端調用它們的時候能夠互不影響地變化。
【策略模式UML圖】
【策略模式-JAVA代碼實現】
從策略模式UML圖中可以看到Context與接口Strategy是組合關係,即強引用關係。
新建一個輪胎接口:
package strategy_interface; public interface tyre_interface { // tyre 輪胎 public void print_tyre_line();// 顯示出輪胎的痕跡 } |
新建2個輪胎接口的實現類:
package strategy_implement; import strategy_interface.tyre_interface; //長痕跡輪胎類 public class tyre_long_implement implements tyre_interface { public void print_tyre_line() { System.out.println("在路面上顯示一個長輪胎痕跡"); } } |
package strategy_implement; import strategy_interface.tyre_interface; //短痕跡輪胎類 public class tyre_short_implement implements tyre_interface { public void print_tyre_line() { System.out.println("在路面上顯示一個短輪胎痕跡"); } } |
組裝一個Car車類:
package car_package; import strategy_interface.tyre_interface; public class Car { private String make_address;// 製造地 private int death_year;// 報廢年限 private int speed;// 速度 private tyre_interface tyre_interface_ref;// 輪胎的樣式 public String getMake_address() { return make_address; } public void setMake_address(String make_address) { this.make_address = make_address; } public int getDeath_year() { return death_year; } public void setDeath_year(int death_year) { this.death_year = death_year; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public tyre_interface getTyre_interface_ref() { return tyre_interface_ref; } public void setTyre_interface_ref(tyre_interface tyre_interface_ref) { this.tyre_interface_ref = tyre_interface_ref; } public void start() { System.out.println("車的基本信息爲:"); System.out.println("製造地make_address:" + this.getMake_address()); System.out.println("報廢年限death_year:" + this.getDeath_year()); System.out.println("速度speed:" + this.getSpeed()); System.out.println("Car 起動了!"); System.out.println("Car高速行駛,遇到一個大轉彎,路面顯示:"); this.getTyre_interface_ref().print_tyre_line(); } } |
讓車跑起來,並且具有更換輪胎樣式的功能:
package main_run; import strategy_implement.tyre_long_implement; import strategy_implement.tyre_short_implement; import car_package.Car; public class run_main { public static void main(String[] args) { tyre_long_implement tyre_long_implement = new tyre_long_implement(); tyre_short_implement tyre_short_implement = new tyre_short_implement(); Car car = new Car(); car.setDeath_year(8); car.setMake_address("北京朝陽區"); car.setSpeed(200); car.setTyre_interface_ref(tyre_long_implement); car.start(); } } |
控制檯打印出:
車的基本信息爲: 製造地make_address:北京朝陽區 報廢年限death_year:8 速度speed:200 Car 起動了! Car高速行駛,遇到一個大轉彎,路面顯示: 在路面上顯示一個長輪胎痕跡 |
是一個長輪胎痕跡,但在程序中可以使用代碼:car.setTyre_interface_ref(tyre_long_implement);來對輪胎的樣式進行不同的替換,可以替換成短輪胎痕跡的汽車輪胎,這樣在不更改Car類的前題下進行了不同輪胎樣式的改變,輪胎和輪胎之間可以互相替換,這就是策略模式。