天天看點

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

本文為HeadFirst設計模式的學習筆記,如需轉載,請注明作者和出處,謝謝!

<a href="http://files.cnblogs.com/nokiaguy/designpatterns.rar" target="_blank">源代碼下載下傳</a>

    政策模式的設計原則如下:

    1.  将應用中需要經常變化的代碼獨立出來,應和那些不需要經常變化的代碼分開。

    2.  應針對接口,而不是類進行程式設計。

    3.  在類中應多用組合,少用繼承。

    例子:

    我們要實作一個鴨子模拟器,這個鴨子模拟器由Duck類描述,而Duck類有如下4個行為:

    1.  display

    2.  swim

    3.  fly(飛)

    4.  quack(叫)

    其中swim是所有鴨子都具有的特性,而且所有鴨子的這些特性都相同,是以,這個方法可以直接在Duck類中實作。display方法也是所有鴨子具有的特性,但随着鴨子的種類不同,display也有所不同,是以,display方法應為Duck類的抽象方法。fly和quack并不是所有鴨子的特性,如橡皮鴨子即不會飛,也不會叫。是以,可以将這兩個方法看作是兩個行為,可将每一個行為設計成一個接口。這樣可以和Duck類完全脫離。因為,fly和quack與Duck一點關系都沒有(别的東西也可能fly和quack),然後不同的fly和quack分别用實作相應接口的類表示。

    下面是關于Duck的完整代碼:

fly行為

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

    //  飛行接口

    public interface FlyBehavior

    {

        String fly();

    }

    //  飛

    public class FlyWithWing : FlyBehavior

        public String fly()

        {

            return "正在用翅膀飛行

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

";

        }

    //  不飛

    public class FlyNoWay : FlyBehavior

            return "不會飛";

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

 quack行為

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

    //  叫

    public interface QuackBehavior

        String quack();

    // 嘎嘎叫

    public class Quack : QuackBehavior

        public String quack()

            return "嘎嘎叫

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

    //  吱吱叫

    public class Squeak : QuackBehavior

            return "吱吱叫

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

    //  不叫

    public class MuteQuack : QuackBehavior

            return "不會叫";

    } 

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

實作Duck類

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

    //  鴨子超類

    public abstract class Duck

        protected FlyBehavior flyBehavior;

        protected QuackBehavior quackBehavior;

        public Duck()

            //  預設的行為

            flyBehavior = new FlyWithWing();

            quackBehavior = new Quack();

        public String swim()

            return "正在遊泳

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

        public String performFly()

            return flyBehavior.fly();

        public String performQuack()

            return quackBehavior.quack();

        public void setFlyBehavior(FlyBehavior flyBehavior)

            this.flyBehavior = flyBehavior;

        public void setQuackBehavior(QuackBehavior quackBehavior)

            this.quackBehavior = quackBehavior;

        public abstract String display();

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

建立不同的鴨子類

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

    //  野鴨

    public class MallardDuck : Duck

        public override String display()

            return "綠頭鴨";

    //  紅頭鴨

    public class RedHeadDuck : Duck

            return "紅頭鴨";

    //  橡皮鴨

    public class RubberDuck : Duck

            return "橡皮鴨";

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

接口與類的關系如下圖

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

調用代碼如下:

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

private void printMsg(Duck duck)

{

    txtMsg.AppendText(duck.display());

    txtMsg.AppendText(duck.performFly());            

    txtMsg.AppendText(duck.performQuack());

}

private void btnStrategy_Click(object sender, EventArgs e)

    txtMsg.Clear();

    Duck duck = new MallardDuck();

    printMsg(duck);

    txtMsg.AppendText("\r\n");

    duck = new RedHeadDuck();

    duck.setQuackBehavior(new Squeak());

    duck = new RubberDuck();

    duck.setFlyBehavior(new FlyNoWay());

    duck.setQuackBehavior(new MuteQuack());

    txtMsg.AppendText(duck.swim());

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

輸出結果如下:

綠頭鴨正在用翅膀飛行

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

嘎嘎叫

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

紅頭鴨正在用翅膀飛行

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

吱吱叫

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

橡皮鴨不會飛不會叫正在遊泳

HeadFirst設計模式學習筆記(C#版):鴨子與政策(Strategy)模式

本文轉自銀河使者部落格園部落格,原文連結http://www.cnblogs.com/nokiaguy/archive/2009/02/11/1388168.html如需轉載請自行聯系原作者

銀河使者