策略模式設(shè)計(jì)原則(幾乎所有的模式都是如此):
1.找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,不要和那些不需要變化的代碼混在一起。
2.針對(duì)接口編程而不是實(shí)現(xiàn).
3.多用組合,少用繼承.
策略模式定義:定義了算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓算法的變化獨(dú)立于使用算法的客戶。
PS:算法族即行為族
使用策略模式構(gòu)建一個(gè)小應(yīng)用,比如在鳥類中最基本的行為族(也就是算法族) 飛行與鳴叫,而每種鳥的行為甚至都不一致,如果要你寫個(gè)程序來演示鳥類(各類別),你該怎么做?
參看策略模式的定義:定義算法族,分別封裝起來。
我們可以將飛行與鳴叫的定義封裝成接口,參看代碼:
/**
* 飛行基類
* @author BruceLeey
*/
public interface IFly {
public void fly();
}
/**
* 叫喚基類
* @author BruceLeey
*/
public interface IYell {
public void yell();
}
根據(jù)不同鳥類飛行的特點(diǎn)生成飛行與鳴叫的實(shí)現(xiàn),比如:
/**
* 麻雀飛行實(shí)現(xiàn)類
* @author BruceLeey
*/
public class MaqFly implements IFly{
public void fly() {
System.out.println("麻雀飛起來小巧,速度慢!");
}
}
/**
* 老鷹飛行的實(shí)現(xiàn)類
* @author BruceLeey
*/
public class YingFly implements IFly{
public void fly() {
System.out.println("老鷹的飛行速度很快,獵物幾乎無處可逃!");
}
}
鳥類中也存在不會(huì)飛的鳥,比如鴕鳥
/**
* 不會(huì)飛
* @author BruceLeey
*/
public class NowayFly implements IFly{
public void fly() {
System.out.println("很抱歉,它不會(huì)飛!");
}
}
鳴叫的實(shí)現(xiàn)也是如此。接下來我們就可以定義鳥類的基本類了。
/**
* 鳥類基類
* @author BruceLeey
*/
public abstract class Bird {
private IFly fly;
private IYell yell;
public void fly() {
fly.fly();
}
public void yell() {
yell.yell();
}
public abstract void display();
public void setIFly(IFly fly) {
this.fly = fly;
}
public IFly getIFly() {
return this.fly;
}
public void setIYell(IYell yell) {
this.yell = yell;
}
public IYell getIYell() {
return this.yell;
}
}
算法族由GetSet傾入,在基類中將行為實(shí)現(xiàn),但不具體指定,具體指定留由客戶。麻雀類實(shí)現(xiàn)如下,其他的寫法亦是如此。
/**
* 麻雀
* @author BruceLeey
*/
public class Maq extends Bird{
@Override
public void display() {
System.out.println("我是麻雀!!!");
}
}
在麻雀的實(shí)現(xiàn)類里我們已經(jīng)將行為委托到父類,父類則委托給對(duì)應(yīng)的行為接口,這就是:針對(duì)接口編程而不是實(shí)現(xiàn)。
測(cè)試代碼與測(cè)試信息如下:
/**
*
* @author BruceLeey
*/
public class TestBird extends TestCase{
public void testMaq() {
Bird bird=new Maq();
bird.setIFly(new MaqFly());
bird.setIYell(new MaqYell());
bird.display();
bird.fly();
bird.yell();
}
public void testYing() {
Bird bird=new Ying();
bird.setIFly(new YingFly());
bird.setIYell(new YingYell());
bird.display();
bird.fly();
bird.yell();
}
public void testTuon() {
Bird bird=new Tuon();
bird.setIFly(new NowayFly());
bird.setIYell(new TuonYell());
bird.display();
bird.fly();
bird.yell();
}
}
輸出如下:
我是麻雀!!!
麻雀飛起來小巧,速度慢!
麻雀叫起來吱吱的聲音~~~
我是老鷹!!!
老鷹的飛行速度很快,獵物幾乎無處可逃!
老鷹叫喚起來是:嘯~~~~
我是鴕鳥?。。?/p>
很抱歉,它不會(huì)飛!
鴕鳥叫喚起來我也不知道~~~--#
參考資料:《Head First Designer pattern》
posted on 2009-09-26 14:47
Worker 閱讀(220)
評(píng)論(0) 編輯 收藏 所屬分類:
設(shè)計(jì)模式