設計原則:
??????
#找出應用中可能需要變化之處,把它們獨立出來,不要和不需要變化的代碼混在一起(即使是行為)
????? #針對接口編程,而不是針對實現編程。(實例化對象時使用多態)????? #多用組合,少用繼承策略模式:定義了算法族,分別封裝起來,讓他們可以互相替換,此模式讓算法的變化獨立與使用算法的客戶
Strategy模式的UML類別結構圖如下:


環境:顧客或用戶需要別的東西,或者想要新動能;公司決定采用別的數據庫產品,又從另一家廠商買了數據,造成數據格式不兼容
例:一群鴨子,有些會飛,有些會叫,有些會游泳等,會添加新功能。不同種類的特性不一樣
???
用Strategy實現,UML圖如下:

?代碼:FlyBehavior.java (將飛行行為封裝成接口)
1?public?interface?FlyBehavior?{
2?????void?fly();
3?}
??????
? ? ?? FlyWithWings.java (具體實現接口的類)
1?public?class?FlyWithWings?implements?FlyBehavior?{
2?????public?void?fly()?{
3?????????System.out.println("I'm?is?flying");
4?????????
5?????}
6}
???? ? FlyNoWay.java
1?public?class?FlyNoWay?implements?FlyBehavior?{
2?????public?void?fly()?{
3?????????System.out.println("I?can't?fly!");
4?????}
5?}
6?
?????? QuackBehavior.java(將叫喊行為封裝成接口)
1 public?interface?QuackBehavior?{
2???? void?Qquack();
3 }
?????? Quack.java(具體實現叫喊的類)
1?
public?class?Quack?implements?QuackBehavior?{
2?
????public?void?Qquack()?{
3?
????????System.out.println("quack,quack
");
4?
????}
5?
}
6?
?????? Squeak.java MuteQuack.java 類似的實現叫喊接口的類
?????? ........................
?????
??????
Duck.java
??
?1?public?abstract?class?Duck?{
?2?????FlyBehavior?flyBehavior;
?3?????QuackBehavior?quackBehavior;
?4?????
?5?????public?void?Swin()?{
?6?????????System.out.println("I'm?swining!");
?7?????}
?8?????
?9?????public?abstract?void?display();
10?????
11?????public?void?performFly()?{?
12?????????flyBehavior.fly();
13?????}
14?????
15?????public?void?performQuack()?{
16?????????quackBehavior.Qquack();
17?????}
18?
19?????public?void?setFlyBehavior(FlyBehavior?flyBehavior)?{
20?????????this.flyBehavior?=?flyBehavior;
21?????}
22?
23?????public?void?setQuackBehavior(QuackBehavior?quackBehavior)?{
24?????????this.quackBehavior?=?quackBehavior;
25?????}
26?????
27?????
28?}
??????
MallardDuck.java
?
?1?public?class?MallardDuck?extends?Duck?{
?2?????public?MallardDuck()?{
?3?????????flyBehavior?=?new?FlyNoWay();
?4?????????quackBehavior?=?new?Quack();
?5?????}
?6?????
?7?????@Override
?8?????public?void?display()?{
?9?????????System.out.println("I'm?a?MallarDuck!");
10?
11?????}
12?
13?}
14?
?????? RedheadDuck? RubberDuck 類似繼承Duck實現以上方法....
?????? 最后Main.java....
?1?public?class?Main?{
?2?????public?static?void?main(String[]?args)?{
?3?????????Duck?mallardDuck?=?new?MallardDuck();
?4?????????mallardDuck.display();
?5?????????mallardDuck.performQuack();
?6?????????mallardDuck.performFly();
?7?????????System.out.println();
?8?????????
?9?????????Duck?redheadDuck?=?new?RedheadDuck();
10?????????redheadDuck.display();
11?????????redheadDuck.performQuack();
12?????????redheadDuck.performFly();
13?????????System.out.println();
14?}
? 若想增加一個模型鴨,原本不會FLY,后面加了火箭會飛了,
? 首先,添加個繼承Duck的ModelDuck類.方法與上面相似,然后添加個實現飛行接口的類.
? FlyRocketPower.java
1?public?class?FlyRocketPower?implements?FlyBehavior?{
2?????public?void?fly()?{
3?????????System.out.println("I'm?flying?with?a?rocket!");
4?
5?????}
6?}
7?
? 在Main類中加一下:
?
1?Duck?modelDuck?=?new?ModelDuck();
2?????????modelDuck.performQuack();
3?????????modelDuck.performFly();
4?????????modelDuck.setFlyBehavior(new?FlyRocketPower());
5?????????modelDuck.performFly();
?
? 運行下,一切皆有可能~~~
??????