Strategy(策略模式)


          設計原則
          ?????? #找出應用中可能需要變化之處,把它們獨立出來,不要和不需要變化的代碼混在一起(即使是行為)
          ????? #針對接口編程,而不是針對實現編程。(實例化對象時使用多態)
          ????? #多用組合,少用繼承

          策略模式:定義了算法族,分別封裝起來,讓他們可以互相替換,此模式讓算法的變化獨立與使用算法的客戶

          Strategy模式的UML類別結構圖如下:

          Strategy2.jpg
          環境:顧客或用戶需要別的東西,或者想要新動能;公司決定采用別的數據庫產品,又從另一家廠商買了數據,造成數據格式不兼容

          :一群鴨子,有些會飛,有些會叫,有些會游泳等,會添加新功能。不同種類的特性不一樣
          ???
          用Strategy實現,UML圖如下:
          Strategy1.jpg


          ?代碼: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();
          ?
          ? 運行下,一切皆有可能~~~
          ??????

          posted on 2008-09-04 18:48 nonels 閱讀(225) 評論(0)  編輯  收藏 所屬分類: DesignPattern


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2008年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類(16)

          隨筆檔案(16)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 高台县| 齐河县| 长寿区| 肥东县| 乌拉特后旗| 通许县| 徐水县| 正镶白旗| 阳谷县| 涪陵区| 宣汉县| 云龙县| 塔城市| 苏尼特左旗| 兴化市| 泊头市| 灵武市| 陆良县| 六盘水市| 将乐县| 舒兰市| 白水县| 云梦县| 静海县| 阳东县| 葫芦岛市| 略阳县| 丽水市| 绿春县| 漠河县| 会东县| 和平区| 青田县| 三穗县| 贺兰县| 兰州市| 宝坻区| 阿尔山市| 嫩江县| 海门市| 和林格尔县|