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 閱讀(224) 評論(0)  編輯  收藏 所屬分類: DesignPattern


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


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

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類(16)

          隨筆檔案(16)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 澄迈县| 太保市| 博乐市| 屏东县| 富平县| 黄骅市| 富川| 海淀区| 务川| 乌兰浩特市| 栾城县| 望城县| 湘潭县| 平阴县| 乐山市| 宁远县| 保靖县| 盐山县| 姚安县| 永平县| 招远市| 伊金霍洛旗| 五指山市| 永修县| 高淳县| 华亭县| 温州市| 榆社县| 普安县| 朝阳县| 洛南县| 金湖县| 宾川县| 密云县| 西乌珠穆沁旗| 离岛区| 信丰县| 宜丰县| 内黄县| 潼南县| 娄底市|