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


環(huán)境:顧客或用戶需要?jiǎng)e的東西,或者想要新動(dòng)能;公司決定采用別的數(shù)據(jù)庫(kù)產(chǎn)品,又從另一家廠商買了數(shù)據(jù),造成數(shù)據(jù)格式不兼容
例:一群鴨子,有些會(huì)飛,有些會(huì)叫,有些會(huì)游泳等,會(huì)添加新功能。不同種類的特性不一樣
???
用Strategy實(shí)現(xiàn),UML圖如下:

?代碼:FlyBehavior.java (將飛行行為封裝成接口)
1?public?interface?FlyBehavior?{
2?????void?fly();
3?}
??????
? ? ?? FlyWithWings.java (具體實(shí)現(xiàn)接口的類)
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(具體實(shí)現(xiàn)叫喊的類)
1?
public?class?Quack?implements?QuackBehavior?{
2?
????public?void?Qquack()?{
3?
????????System.out.println("quack,quack
");
4?
????}
5?
}
6?
?????? Squeak.java MuteQuack.java 類似的實(shí)現(xiàn)叫喊接口的類
?????? ........................
?????
??????
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實(shí)現(xiàn)以上方法....
?????? 最后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?}
? 若想增加一個(gè)模型鴨,原本不會(huì)FLY,后面加了火箭會(huì)飛了,
? 首先,添加個(gè)繼承Duck的ModelDuck類.方法與上面相似,然后添加個(gè)實(shí)現(xiàn)飛行接口的類.
? 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();
?
? 運(yùn)行下,一切皆有可能~~~
??????