一:前言
清明無意中翻出一位老師介紹我看的設計模式電子書,沒想到已經參加工作十個月了,因爲在學校的時候主要做的是底層網絡通信,沒有使用過java,
當然現在科班出身的本科生都要學java的吧,記得當時自己覺得學習java沒用,幾乎堂堂翹課,跑去圖書館看史蒂文的《TCP/IP詳解》系列、《unix高級環境編程》等底層網絡通信的書籍,考試前一天看了下教材,就考試去了,成績還不錯。找工作的時候也是通過底層網絡的技術獲得目前公司的offer,然而陰差陽錯的我被安排到了java研發崗位上,當然牴觸肯定會有的,相信有相同經歷的朋友會有同感。好吧,公司的那句話說的很棒,“永遠不變的是變化”,幾乎從零開始學習java,從C轉換爲java開發,其中有很多東西要學習,問了很多小白的問題,你懂的,我不懂啊,小白就小白吧,一時小白被人鄙視總比不懂裝懂強,幸好有師傅鐵大師帶,從零開始教我,非常感謝他,是他把我領進了門。在研究團隊項目的時候,發現有很多地方設計的相當巧妙,擴展性相當好,今天看到cbf4life著作的《設計模式》書籍時有種醍醐灌頂的感覺,原來這些都是設計模式,java開發框架的精華。
二:strategy
pattern
水杯就是一個strategy pattern,一個水杯可以用來裝白開水、牛奶、beer等,對外只提供drink服務,它自己並不關心裏面裝是什麼,它只是一個容器。
先定義一個接口water:
package com.netboy.demo;
/**
* @功能: 水的接口
* @版本號:
* @作者: netboy Email:[email protected]
* @時間: 2013-4-5 下午08:17:27
* @例子:
*/
public interface Water {
public void taste();
}
子類白開水:
package com.netboy.demo;
/**
* @功能:
* @版本號:
* @作者: netboy Email:[email protected]
* @時間: 2013-4-5 下午08:20:17
* @例子:
*/
public class GoodWater implements Water {
@Override
public void taste() {
System.out.println("白開水,是最健康的。");
}
}
子類牛奶:
package com.netboy.demo;
/**
* @功能:
* @版本號:
* @作者: netboy Email:[email protected]
* @時間: 2013-4-5 下午08:21:50
* @例子:
*/
public class MilkWater implements Water {
@Override
public void taste() {
System.out.println("牛奶,富含營養");
}
}
子類beer:
package com.netboy.demo;
/**
* @功能: 啤酒類
* @版本號:
* @作者: netboy Email:[email protected]
* @時間: 2013-4-5 下午08:23:03
* @例子:
*/
public class BeerWater implements Water {
@Override
public void taste() {
System.out.println("啤酒,適量爲佳");
}
}
水杯類,用來爲人提供服務:
package com.netboy.demo;
import java.util.ArrayList;
import java.util.List;
/**
* @功能: 水杯,用來承裝飲料,提供服務
* @版本號:
* @作者: netboy Email:[email protected]
* @時間: 2013-4-5 下午08:24:44
* @例子:
*/
public class Cup {
private List<Water> waterList = new ArrayList<Water>();
public void service() {
if(waterList.size() <= 0) {
System.out.println("sorry,the cup is empty");
return;
}
for(Water water : waterList) {
water.taste();
}
}
public void add(Water water) {
this.waterList.add(water);
}
}
定義一個人,去實現飲料和水杯的價值:
package com.netboy.demo;
/**
* @功能:
* @版本號:
* @作者: netboy Email:[email protected]
* @時間: 2013-4-5 下午08:16:20
* @例子:
*/
public class Man {
public static void main(String[] args) {
System.out.println("hello,this is strategy pattern");
Water milk = new MilkWater();
Water beer = new BeerWater();
Water whiteWater = new GoodWater();
Cup cup = new Cup();
//向容器中添加白開水
cup.add(whiteWater);
cup.service();
//添加其它飲料
cup.add(beer);
cup.add(milk);
cup.service();
}
}
運行如下:
*******************************************************************************************
*******************************************************************************************
對於水杯來說,裏面裝的是什麼,它並不關心,它只是爲調用它的類提供service()服務,這樣很方便進行擴展,如果飲料類型變化,我們只需要定義一個新類實現water接口,然後可以通過spring將其注入到cup類的waterList中,那麼waterlist中的所有water子類的taste()方法都會被調用。
上面的杯子類有點小bug,應該添加上清空方法:
public class Cup {
private List<Water> waterList = new ArrayList<Water>();
public void service() {
if(waterList.size() <= 0) {
System.out.println("sorry,the cup is empty");
return;
}
for(Water water : waterList) {
water.taste();
}
}
public void add(Water water) {
this.waterList.add(water);
}
/**
* 清空杯子
*/
public void clearCup() {
waterList.clear();
System.out.println("杯子已經清空了");
}
}
執行類:
public class Man {
public static void main(String[] args) {
System.out.println("hello,this is strategy pattern");
Water milk = new MilkWater();
Water beer = new BeerWater();
Water whiteWater = new GoodWater();
Cup cup = new Cup();
//向容器中添加白開水
cup.add(whiteWater);
cup.service();
//添加其它飲料
cup.add(beer);
cup.add(milk);
cup.service();
//clear the cup
cup.clearCup();
}
}