快樂技術沙龍即將一週歲了,最近它又多了個妹妹叫《嗨皮吧》,春哥(秦春林)還是很給力啊!一連搞兩個組織(社團 (∩_∩)),那麼還是主要介紹一下妹妹嗨皮吧好啦,說起嗨皮吧還真是有很多吸引人的地方,它有線上和下線兩種模式,可以在嗨皮吧的網站上交流,也可以週末了來我們這裏放鬆、聚會、打牌、寫代碼、蹭網、吃飯等等,嗨皮吧正式啓動第一天還是很給力很多好朋友都來捧場,一起吃飯、打牌、玩遊戲(XBOX)。對了地址是:北京市海淀區西二旗領秀新硅谷A區4樓402室,歡迎大家週末來一起交流!廢話不多說啦。。。。。
1、應用場景
開始今天的主題吧,今天的主題是建造者模式,按慣例還是以一個真實的場景來模擬的去描述,還是嗨皮吧(http://happy-bar.com/),嗨皮吧線上活動有一個分享技術的版塊,會根據大家感興趣的技術方向找一些該技術方向的高手、老手來錄製視頻與大家分享,比如:秦春林擅長:WP7、cocos2d-xna,蛋子(張智)擅長:ASP.NET、Oracle!那麼這個時候嗨皮吧線上版塊的嗨客們對最近的WP7版本的遊戲引擎cocos2d-xna很感興趣,我們就會找秦春林(COCOS2D核心開發人員)來爲我們錄製一套關於COCOS2D在WP7手機上游戲開發的視頻。好吧,有代碼模擬一下吧!
首先,需要有秦春林這個類我們這裏叫:MrQin,有了MrQin這個類就相當於他已經到我們這裏準備錄製節目了,按秦春林錄製節目的習慣,他喜歡:
第一步:給大家先演示下今天講解內容的效果。方法名:DemonstrationEfect()
第二步:根據事先準備好的PPT講解原理。方法名:Principle()
第三步:打開工程分析實現功能的代碼。方法名:AnalysisOfCode()
那麼秦春林錄製視頻的C#代碼實現如下:
- /// <summary>
- /// 秦春林
- /// </summary>
- public class MrQin
- {
- /// <summary>
- /// 演示效果
- /// </summary>
- public void DemonstrationEfect()
- {
- Console.WriteLine("演示WP7-COCOS2D,遊戲效果!");
- }
- /// <summary>
- /// PPT原理講解
- /// </summary>
- public void Principle()
- {
- Console.WriteLine("PPT講解實現原理");
- }
- /// <summary>
- /// 分析代碼
- /// </summary>
- public void AnalysisOfCode()
- {
- Console.WriteLine("根據原理分析代碼");
- }
- }
第一步(與MrQin一樣):給大家先演示下今天講解內容的效果。方法名:DemonstrationEfect()
第二步:現場代碼實現。方法名:Coding()
第三步:分析與回顧關鍵點。AnalysisOfKeyPoints()
代碼實現如下:
- /// <summary>
- /// 程序員蛋子張智
- /// </summary>
- public class MrZhang
- {
- /// <summary>
- /// 演示效果
- /// </summary>
- public void DemonstrationEfect()
- {
- Console.WriteLine("演示ASP.NET+Oracle Web項目效果!");
- }
- /// <summary>
- /// 代碼實現
- /// </summary>
- public void Coding()
- {
- Console.WriteLine("邊代碼實現邊講解原理!");
- }
- /// <summary>
- /// 分析與回顧關鍵點
- /// </summary>
- public void AnalysisOfKeyPoints()
- {
- Console.WriteLine("分析代碼實現中的關鍵技術點");
- }
- }
第一步:給大家先演示下今天講解內容的效果。
第二步:PPT給大家講解必須的基礎知識與原理
第三部:代碼實現內容。
第四部:關鍵點分析。
那我們如何改造我們上邊的代碼呢?既然我們可以吧一個通用的流程分析出來,將來不管錄製的是WP7的還是ASP.NET還是WCF等,我們都可以以這個流程來錄製,那麼這裏就體現出一種模式的優勢啦,什麼模式? 答:建造者模式。
2、建造者模式
建造者模式:將一個複雜對象的構建與他的表示分離,是的同樣的構建過程可以創建不同的表示。
建造者模式類圖如下:
指揮者(Dicrector)類:用來包含一個Builder的抽象類,用來表示使用哪個具體的建造者類。
抽象建造者(Builder)類:用來抽象product類構建的流程。
具體的建造者(ConcreteBuilder)類:用來實現具體建造產品的細節。
產品(Product)類:用來承載建造好產品的細節。
以我們上邊的場景來看,錄製視頻的步驟就是構建過程,我們的視頻就是表示(產品Product),嗨客們和嗨皮吧就是指揮者啦,具體來錄製視頻的高手們就是我們的具體建造者啦!
上邊場景我們已經將嗨皮吧錄製視頻的統一步驟抽象了出來,那麼我們就先把這個抽象的步驟類實現吧,也就是建造者模式中的抽象建造者(Builder)類。
代碼如下:
- /// <summary>
- /// 抽象建造這類
- /// </summary>
- public abstract class VidioBuilder
- {
- //定義我們之前抽象好的四個步驟
- //第一步:給大家先演示下今天講解內容的效果。
- //第二步:PPT給大家講解必須的基礎知識與原理。
- //第三步:代碼實現內容。
- //第四步:關鍵點分析。
- //第一步
- public abstract void DemonstrationEfect();
- //第二步
- public abstract void Principle();
- //第三步
- public abstract void Coding();
- //第四步
- public abstract void AnalysisOfKeyPoints();
- //獲得視頻
- public abstract VidioProduct GetVidio();
- }
抽象好了通用的流程當然接下來就可以實現具體根據流程來錄製視頻的高手們啦,說要錄製視頻當然少補了視頻這個類了。代碼如下:
- /// <summary>
- /// 視頻類
- /// </summary>
- public class VidioProduct
- {
- List<string> list = new List<string>();
- /// <summary>
- /// 添加內容
- /// </summary>
- /// <param name="content"></param>
- public void AddVidioContent(string content)
- {
- list.Add(content);
- }
- /// <summary>
- /// 播放視頻
- /// </summary>
- public void PlayVidio()
- {
- Console.WriteLine("視頻內容爲:");
- foreach (string str in list)
- {
- Console.WriteLine(str);
- }
- }
- }
- /// <summary>
- /// 秦春林
- /// </summary>
- public class MrQin : VidioBuilder
- {
- VidioProduct vidio = new VidioProduct();
- /// <summary>
- /// 演示效果
- /// </summary>
- public override void DemonstrationEfect()
- {
- vidio.AddVidioContent("演示WP7-COCOS2D,遊戲效果!");
- }
- /// <summary>
- /// PPT原理講解
- /// </summary>
- public override void Principle()
- {
- vidio.AddVidioContent("PPT講解實現原理");
- }
- /// <summary>
- /// 代碼實現
- /// </summary>
- public override void Coding()
- {
- vidio.AddVidioContent("邊代碼實現邊講解原理!");
- }
- /// <summary>
- /// 分析與回顧關鍵點
- /// </summary>
- public override void AnalysisOfKeyPoints()
- {
- vidio.AddVidioContent("分析代碼實現中的關鍵技術點");
- }
- /// <summary>
- /// 獲得錄製好的視頻
- /// </summary>
- /// <returns></returns>
- public override VidioProduct GetVidio()
- {
- return vidio;
- }
- }
- /// <summary>
- /// 程序員蛋子張智
- /// </summary>
- public class MrZhang : VidioBuilder
- {
- VidioProduct vidio = new VidioProduct();
- /// <summary>
- /// 演示效果
- /// </summary>
- public override void DemonstrationEfect()
- {
- vidio.AddVidioContent("演示ASP.NET+Oracle Web項目效果!");
- }
- /// <summary>
- /// PPT原理講解
- /// </summary>
- public override void Principle()
- {
- vidio.AddVidioContent("PPT講解實現原理");
- }
- /// <summary>
- /// 代碼實現
- /// </summary>
- public override void Coding()
- {
- vidio.AddVidioContent("邊代碼實現邊講解原理!");
- }
- /// <summary>
- /// 分析與回顧關鍵點
- /// </summary>
- public override void AnalysisOfKeyPoints()
- {
- vidio.AddVidioContent("分析代碼實現中的關鍵技術點");
- }
- /// <summary>
- /// 獲得錄製好的視頻
- /// </summary>
- /// <returns></returns>
- public override VidioProduct GetVidio()
- {
- return vidio;
- }
- }
可見我們邀請的兩位高手都按照我們統一錄製視頻的順序錄制視頻啦,那麼是誰邀請我們的高手呢?當然我們還有一個指揮者啦,指揮者就是我們的嗨客們與嗨皮吧啦,我們來提出需要視頻的類型,代碼如下:
- /// <summary>
- /// 嗨客指揮者
- /// </summary>
- public class HappyDirector
- {
- public void BuildingVidio(VidioBuilder builder)
- {
- //第一步
- builder.DemonstrationEfect();
- //第二步
- builder.Principle();
- //第三步
- builder.Coding();
- //第四步
- builder.AnalysisOfKeyPoints();
- }
- }
- static void Main(string[] args)
- {
- HappyDirector director = new HappyDirector();
- VidioBuilder mrQin = new MrQin();
- VidioBuilder mrZhang = new MrZhang();
- //首先讓秦春林錄製WP7 cocos2d遊戲開發視頻
- director.BuildingVidio(mrQin);
- VidioProduct v1 = mrQin.GetVidio();
- v1.PlayVidio();
- //接下來讓張智錄製 asp.net oracle項目實戰視頻
- director.BuildingVidio(mrZhang);
- VidioProduct v2 = mrZhang.GetVidio();
- v2.PlayVidio();
- }
那麼建造者模式就已經完成了,順便再說一下,5月份快樂技術沙龍一週歲將舉辦一次大活動噢,有抽獎環節,歡迎在北京的嗨客們來體驗WP7與WINDOW8的技術交流。