策略模式的設計原則如下:
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
{
public String fly()
{
return "不會飛";
}
}
quack行為
// 叫
public interface QuackBehavior
{
String quack();
}
// 嘎嘎叫
public class Quack : QuackBehavior
{
public String quack()
{
return "嘎嘎叫";
}
}
// 吱吱叫
public class Squeak : QuackBehavior
{
public String quack()
{
return "吱吱叫";
}
}
// 不叫
public class MuteQuack : QuackBehavior
{
public String quack()
{
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
{
public override String display()
{
return "紅頭鴨";
}
}
// 橡皮鴨
public class RubberDuck : Duck
{
public override String display()
{
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());
printMsg(duck);
txtMsg.AppendText("\r\n");
duck = new RubberDuck();
duck.setFlyBehavior(new FlyNoWay());
duck.setQuackBehavior(new MuteQuack());
printMsg(duck);
txtMsg.AppendText(duck.swim());
txtMsg.AppendText("\r\n");
}
輸出結果如下:
綠頭鴨正在用翅膀飛行嘎嘎叫
紅頭鴨正在用翅膀飛行吱吱叫
橡皮鴨不會飛不會叫正在游泳
《銀河系列原創教程》發布
《Java Web開發速學寶典》出版,歡迎定購
本文出自 “李寧的極客世界” 博客,請務必保留此出處http://androidguy.blog.51cto.com/974126/214969