以下為策略模式詳解:
引子:
?????使用策略就是要實現可擴展性,那么多態是不可少的。何謂可擴展性呢?
???? 比如:我們用面向對象的思想來設計飛機,基類為飛機,飛機可以有很多種,客機,直升機,戰斗機等,不同種類的飛機起飛方式和武器都不一樣,那么在設計時怎樣才能做到支持所有的飛機,每次加入新的種類的飛機時不要去改動之前的代碼直接加入呢?
策略模式應用實例、???? 這就是我們使用策略模式要考慮的問題,如果只用繼承,顯然不行,這樣太死板,像客機它是沒有武器的,當在基類中加入了使用武器方法后,客機也具有了武器,這不科學,而且直升機和戰斗機的武器不同還要強迫每一個子類都復寫使用武器方法。只用接口呢?也是不行的,比如寫一個武器接口,只面有一個使用武器的方法,誰需要安裝武器就實現這個接口,這樣好像比繼承要好一點,但有沒有發現,代碼的可重用性太差,重復代碼會變多,一樣不科學。如果我們在寫代碼時達到不必知道子類的具體類型,只要系統在使用武器時知道使用何種武器,那么這個問題就可以解決,怎么做到呢?
?????針對超類型編程,父類的引用指向子類的對像,這樣就我們就可以驅動必不可少的多態。
????? 我們可以這樣設計:先設置幾個接口,輕武器接口,重武器接口,緩沖起飛接口,垂直起飛接口(完整代碼在最后在下載地址):
/*** @author Homg*/ public interface Weapon {void fire(); }/*** @author Homg*/ public interface TakeOff {void takeOff(); }
?在基類中加入行為變量,申明為對應接口類型,在使用武器和起飛時委托給實例變量引用的對象來具體處理:
private TakeOff takeOff;private Weapon weapon;public void fire() {if (weapon != null) {weapon.fire();}}public void takeOff() {if (takeOff != null) {takeOff.takeOff();}}
然后子類(戰斗機或客機)如果需要起飛和使用武器就要給對應的行為變量賦值,也就是實例化這個繼承而來的行為變量。還有個問題就是飛機有可能需要靈活的更換武器系統啊,那怎么辦?我們可以這樣設計:使用set方法來隨時,靈活的改變接口類型的實例變量,當要換武器時只需要set一下就好:
public void setTakeOff(TakeOff takeOff) {this.takeOff = takeOff;}public void setWeapon(Weapon weapon) {this.weapon = weapon;}
模式和策略有什么區別,入口為這樣:
CopterTakeOff copterTakeOff=new CopterTakeOff();CopterWeapon copterWeapon =new CopterWeapon();Plane plane=new Copter();plane.setTakeOff(copterTakeOff);plane.setWeapon(copterWeapon);
plane.sayName();plane.takeOff();plane.fire();
運行結果:
?? 我是直升機,垂直起飛,使用30毫米機炮開火
入口換成這樣:
PassengerPlaneTakeOff passengerPlaneTakeOff=new PassengerPlaneTakeOff();Plane plane2=new PassengerPlane();plane2.setTakeOff(passengerPlaneTakeOff);plane2.sayName();plane2.takeOff();plane2.fire();
運行結果:
?? 我是客機,滑動起飛,
策略模式使用場景,客機是沒有武器的,所以沒有使用武器開火。
類圖:
?
應用:
策略模式的意圖、???? 想一下,java封裝的Comparator,是不是也用的策略模式?我們先要實現一個comparator接口,再把他傳入Collections.sort(List<T>list,Comparator<? superT> c)中。
?????還有android中的異步處理(AsyncTask),使用回調接口,這是不是也是策略模式?
總結: ??
????? 這就是策略模式,定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。 ???
????? 分離出可能變化的部分,用一個處理器來處理這些變化,降低系統耦合度,不會牽一發而動全身。 ??
oobe模式、????? 在設計時要多用組合,少用繼承,組合建立的系統有很大的彈性,不僅可將算法族封裝成類,更可以在運行時動態地改變行為,只要組合的行為對象符合正確的接口標準即可。??
?完整代碼下載地址(也可以留下郵箱發給你):
?http://download.csdn.net/detail/homg92/6792431
?