設計模式筆記--策略模式

:前言

     清明無意中翻出一位老師介紹我看的設計模式電子書,沒想到已經參加工作十個月了,因爲在學校的時候主要做的是底層網絡通信,沒有使用過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();
	}
}













發佈了41 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章