1. 程式人生 > >23種設計模式之二(策略模式)

23種設計模式之二(策略模式)

而不是 部分 nts 設定 算法 策略 bstr 算法族 none

策略模式:(分別封裝行為接口,實現算法族,超類裏放行為接口對象,在子類裏具體設定行為對象)

原則:

  分離變化部分,封裝接口,基於接口編程各種功能。此模式讓行為算法的變化獨立於算法的使用者。

  技術分享

舉例說明:

  分別封裝行為接口:FlyBehavior、QuackBehavior;

  實現算法族:BadFlyBehavior、GoodFlyBehavior、NoFlyBehavior;GaGaQuackBehavior、GeGeQuackBehavior、NoQuackBehavior;

  超類裏放行為接口對象:

    技術分享

  在子類裏具體設定行為對象:

    技術分享

    技術分享

  在使用的時候:

    技術分享

例子結構:

技術分享

技術分享
1 package com.java.hexter.stimulateduck.flybehavior;
2 
3 public interface FlyBehavior {
4     void fly();
5 }
FlyBehavior 技術分享
1 package com.java.hexter.stimulateduck.quackbehavior;
2 
3 public interface QuackBehavior {
4     void quack();
5 };
QuackBehavior 技術分享
 1 package com.java.hexter.stimulateduck.duck;
2 3 import com.java.hexter.stimulateduck.flybehavior.FlyBehavior; 4 import com.java.hexter.stimulateduck.quackbehavior.QuackBehavior; 5 6 public abstract class Duck { 7 8 FlyBehavior mFlyBehavior; 9 QuackBehavior mQuackBehavior; 10 11 public Duck() { 12 13 } 14 15 public
void Fly() { 16 mFlyBehavior.fly(); 17 } 18 19 public void Quack() { 20 mQuackBehavior.quack(); 21 } 22 23 public abstract void display(); 24 25 //為了增加代碼的靈活性,可以自己設定鴨子叫的方式 26 public void SetQuackBehavoir(QuackBehavior qb) { 27 mQuackBehavior = qb; 28 } 29 public void SetFlyBehavoir(FlyBehavior fb) { 30 mFlyBehavior = fb; 31 } 32 33 public void swim() { 34 System.out.println("~~im swim~~"); 35 } 36 }
Duck 技術分享
 1 package com.java.hexter.stimulateduck.flybehavior;
 2 
 3 
 4 
 5 public class    BadFlyBehavior implements FlyBehavior
 6 {
 7     @Override
 8     public void fly() {
 9         // TODO Auto-generated method stub
10         System.out.println("--BadFly--");
11     }
12 }
BadFlyBehavior 技術分享
 1 package com.java.hexter.stimulateduck.flybehavior;
 2 
 3 
 4 public class    GoodFlyBehavior implements FlyBehavior
 5 {
 6 
 7     @Override
 8     public void fly() {
 9         // TODO Auto-generated method stub
10         System.out.println("--GoodFly--");
11     }
12     
13 }
GoodFlyBehavior 技術分享
 1 package com.java.hexter.stimulateduck.flybehavior;
 2 
 3 
 4 public class    NoFlyBehavior implements FlyBehavior
 5 {
 6     @Override
 7     public void fly() {
 8         // TODO Auto-generated method stub
 9         System.out.println("--NoFly--");
10     }
11 }
NoFlyBehavior 技術分享
 1 package com.java.hexter.stimulateduck.quackbehavior;
 2 
 3 
 4 public    class GaGaQuackBehavior implements QuackBehavior
 5 {
 6 
 7     @Override
 8     public void quack() {
 9         // TODO Auto-generated method stub
10         System.out.println("__GaGa__");
11     }
12     
13 }
GaGaQuackBehavior 技術分享
 1 package com.java.hexter.stimulateduck.quackbehavior;
 2 
 3 
 4 public    class GeGeQuackBehavior implements QuackBehavior
 5 {
 6 
 7     @Override
 8     public void quack() {
 9         // TODO Auto-generated method stub
10         System.out.println("__GeGe__");
11     }
12     
13 }
GeGeQuackBehavior 技術分享
 1 package com.java.hexter.stimulateduck.quackbehavior;
 2 
 3 
 4 public    class NoQuackBehavior implements QuackBehavior
 5 {
 6 
 7     @Override
 8     public void quack() {
 9         // TODO Auto-generated method stub
10         System.out.println("__NoQuack__");
11     }
12     
13 }
NoQuackBehavior 技術分享
 1 package com.java.hexter.stimulateduck.duck;
 2 
 3 import com.java.hexter.stimulateduck.flybehavior.GoodFlyBehavior;
 4 import com.java.hexter.stimulateduck.quackbehavior.GaGaQuackBehavior;
 5 
 6 public class GreenHeadDuck extends Duck {
 7 
 8     public GreenHeadDuck() {
 9         mFlyBehavior = new GoodFlyBehavior();
10         mQuackBehavior = new GaGaQuackBehavior();
11     }
12 
13     @Override
14     public void display() {
15         // TODO Auto-generated method stub
16         System.out.println("**GreenHead**");
17     }
18 
19 }
GreenHeadDuck 技術分享
 1 package com.java.hexter.stimulateduck.duck;
 2 
 3 import com.java.hexter.stimulateduck.flybehavior.BadFlyBehavior;
 4 
 5 import com.java.hexter.stimulateduck.quackbehavior.GeGeQuackBehavior;
 6 
 7 public class RedHeadDuck extends Duck {
 8 
 9     public RedHeadDuck() {
10         mFlyBehavior = new BadFlyBehavior();
11         mQuackBehavior = new GeGeQuackBehavior();
12     }
13 
14     @Override
15     public void display() {
16         // TODO Auto-generated method stub
17         System.out.println("**RedHead**");
18     }
19 
20 }
RedHeadDuck 技術分享
 1 package com.java.hexter.stimulateduck;
 2 
 3 import com.java.hexter.stimulateduck.duck.Duck;
 4 import com.java.hexter.stimulateduck.duck.GreenHeadDuck;
 5 import com.java.hexter.stimulateduck.duck.RedHeadDuck;
 6 import com.java.hexter.stimulateduck.flybehavior.NoFlyBehavior;
 7 import com.java.hexter.stimulateduck.quackbehavior.NoQuackBehavior;
 8 
 9 
10 public class StimulateDuck {
11 
12     public static void main(String[] args) {
13 
14         Duck mGreenHeadDuck = new GreenHeadDuck();
15         Duck mRedHeadDuck = new RedHeadDuck();
16 
17         mGreenHeadDuck.display();
18         mGreenHeadDuck.Fly();
19         mGreenHeadDuck.Quack();
20         mGreenHeadDuck.swim();
21 
22         mRedHeadDuck.display();
23         mRedHeadDuck.Fly();
24         mRedHeadDuck.Quack();
25         mRedHeadDuck.swim();
26         mRedHeadDuck.display();
27         mRedHeadDuck.SetFlyBehavoir(new NoFlyBehavior());
28         mRedHeadDuck.Fly();
29         mRedHeadDuck.SetQuackBehavoir(new NoQuackBehavior());
30         mRedHeadDuck.Quack();
31     }
32 
33 }
StimulateDuck

輸出結果:

**GreenHead**
--GoodFly--
__GaGa__
~~im swim~~
**RedHead**
--BadFly--
__GeGe__
~~im swim~~
**RedHead**
--NoFly--
__NoQuack__

例子該種方式實現的好處:新增行為簡單,行為類更好的復用,組合更方便。既有繼承帶來的復用好處,沒有挖坑

註意:

  1.認真分析策略中變化部分與不變部分;

  2.多用組合,少用繼承;用行為類組合,而不是行為的繼承;這樣做更有彈性。

23種設計模式之二(策略模式)