本文為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行為

// 飛行接口
public interface FlyBehavior
{
String fly();
}
// 飛
public class FlyWithWing : FlyBehavior
public String fly()
{
return "正在用翅膀飛行
";
}
// 不飛
public class FlyNoWay : FlyBehavior
return "不會飛";

quack行為

// 叫
public interface QuackBehavior
String quack();
// 嘎嘎叫
public class Quack : QuackBehavior
public String quack()
return "嘎嘎叫
// 吱吱叫
public class Squeak : QuackBehavior
return "吱吱叫
// 不叫
public class MuteQuack : QuackBehavior
return "不會叫";
}

實作Duck類

// 鴨子超類
public abstract class Duck
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public Duck()
// 預設的行為
flyBehavior = new FlyWithWing();
quackBehavior = new Quack();
public String swim()
return "正在遊泳
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();

建立不同的鴨子類

// 野鴨
public class MallardDuck : Duck
public override String display()
return "綠頭鴨";
// 紅頭鴨
public class RedHeadDuck : Duck
return "紅頭鴨";
// 橡皮鴨
public class RubberDuck : Duck
return "橡皮鴨";

接口與類的關系如下圖
調用代碼如下:

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());

輸出結果如下:
綠頭鴨正在用翅膀飛行
嘎嘎叫
紅頭鴨正在用翅膀飛行
吱吱叫
橡皮鴨不會飛不會叫正在遊泳
本文轉自銀河使者部落格園部落格,原文連結http://www.cnblogs.com/nokiaguy/archive/2009/02/11/1388168.html如需轉載請自行聯系原作者
銀河使者