策略模式采用組合的形式,把一個演算法任務委托給被組合的介面,根據運行時傳入物件的不同,演算法可以做到相互替換,同時這些變化可以獨立于具體的使用者,
例如,一般車上都會有喇叭,不同的車喇叭的聲音不一樣,將車抽象成一個介面如下:
1 public interface Vehicle{2 void whistle(); //鳴笛3 }
我們都知道,自行車按鈴是“鈴鈴鈴”的聲音,而小汽車則是“嘀嘀”聲,它們都實作了Vehicle介面:
1 public class Bike implements Vehicle{ 2 public void whistle(){ 3 System.out.println("鈴鈴鈴,,,"); 4 } 5 } 6 7 public class implements Vehicle{ 8 public void whistle(){ 9 System.out.println("嘀嘀,,,");10 }11 }
現在,自行車和小汽車都能夠正常的鳴笛了,然而,這種類結構有一個問題,假設小汽車的喇叭壞了,這個時候呼叫它的 whistle 方法沒有發出任何聲音,我們需要換一個喇叭,然而由于 whistle 方法是與具體的車(Car)系結在一起了,要換喇叭,只能連車一起換了,這顯然不劃算,所以需要將喇叭與車進行重新設計,讓喇叭只是作為車里面的一個可以隨時更換的配件,讓喇叭作為一個介面獨立出來,并且在車里放置一個喇叭物件,需要鳴笛的時候,將鳴笛的任務交給喇叭就可以了,
首先,抽象出來一個喇叭介面:
1 public interface Horn{2 void ring(); //喇叭會響3 }
每個車也都需要一個喇叭:
1 public interface Vehicle{2 Horn horn;3 void whistle(); //鳴笛4 }
然后,針對自行車和小汽車,分別設計各自的車鈴:
1 // 自行車鈴 2 public class Bicyclebell implements Horn{ 3 public void ring(){ 4 System.out.println("鈴鈴鈴,,,"); 5 } 6 } 7 8 // 汽車車鈴 9 public class CarbellDiDi implements Horn{10 public void ring(){11 System.out.println("嘀嘀,,,");12 }13 }14 15 // 汽車車鈴16 public class CarbellBaBa implements Horn{17 public void ring(){18 System.out.println("叭叭,,,");19 }20 }
接著在自行車和汽車上都放置一個車鈴:
1 public class Bike implements Vehicle{ 2 // 自行車需要自行車車鈴 3 public Bike(){ 4 this.horn = new Bicyclebell(); 5 } 6 7 public void whistle(){ 8 horn.ring(); 9 }10 11 public void setHorn(Horn horn){12 this.horn = horn;13 }14 }15 16 public class Car implements Vehicle{17 // 汽車需要汽車鈴18 public Car(){19 this.horn = new CarBellDiDi();20 }21 22 public void whistle(){23 horn.ring();24 }25 26 public void setHorn(Horn horn){27 this.horn = horn;28 }29 }
接下來寫一段程式測驗一下我們的代碼,看看是否能夠達到預期:
1 public static void main(String[] args){ 2 Vehicle bike = new Bike(); 3 bike.whistle(); // 鈴鈴鈴,,, 4 5 Vehicle car = new Car(); 6 car.whistle(); // 嘀嘀,,, 7 8 //給汽車換個喇叭 9 car.setHorn(new CarbellBaBa());10 car.whistle(); //叭叭,,,11 }
可以看到,自行車和汽車成功的鳴笛了,并且我們成功地給汽車換了個喇叭,當然,可以看到子類中的whistle方法代碼邏輯都一樣,有些重復,我們完全可以將Vehicle變成一個抽象類,然后在其whistle方法里呼叫horn的ring方法,這樣就可以減少許多冗余的代碼,不過這不是本文的重點,這種實作方式暫且略過,
現在重新審視一下這個設計,不同的車鈴對應著不同的策略,而車則是策略的使用者,通過組合的方式,實作了策略與使用者之間的解耦,并且通過setter方法可以動態的更改策略,這種做法便是運用了策略模式,
參考:<<Head First設計模式>>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/46459.html
標籤:設計模式
上一篇:面向物件的設計原則
