<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Strategy(策略模式)


    設(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)圖如下:

    Strategy2.jpg
    環(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圖如下:
    Strategy1.jpg


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

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


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    <2008年9月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(2)

    隨筆分類(16)

    隨筆檔案(16)

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 理论亚洲区美一区二区三区| 亚洲国产成人精品久久 | 色猫咪免费人成网站在线观看| 另类免费视频一区二区在线观看| 3d成人免费动漫在线观看| 在线视频免费观看爽爽爽| 午夜毛片不卡高清免费| 国产日韩成人亚洲丁香婷婷| 亚洲伊人久久大香线蕉苏妲己| 亚洲av乱码一区二区三区香蕉 | 亚洲精品久久无码| 一区在线免费观看| 91精品免费观看| 日本人的色道www免费一区| 日韩一卡2卡3卡4卡新区亚洲| 亚洲欧洲在线观看| 久久无码av亚洲精品色午夜| 成人精品一区二区三区不卡免费看| 999国内精品永久免费观看| 四虎成人精品在永久免费| 久久亚洲精品成人| 亚洲а∨天堂久久精品9966| 中文字幕av无码不卡免费| 日韩免费一区二区三区在线播放| 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 | 无码精品国产一区二区三区免费| 日本一区二区三区免费高清| 亚洲国产综合精品中文字幕| 亚洲小视频在线播放| 特色特黄a毛片高清免费观看| 久久99热精品免费观看动漫| 国产精品美女自在线观看免费| 久热综合在线亚洲精品| 朝桐光亚洲专区在线中文字幕| 免费av一区二区三区| 国产区卡一卡二卡三乱码免费| 久久久无码精品亚洲日韩蜜臀浪潮 | 国产大片91精品免费观看男同| 亚洲AV日韩精品久久久久久久| 国产精品亚洲专区无码牛牛| 日韩免费高清大片在线|