~~~
【時間:2012年5月25日?19:10???地點:北京西三環某賓館樓下的燒烤店】
~~~
~~~
??軟考前一天,幾個“進京趕考”的“準北漂者”,為了第二天考一個好成績,一致決定殺向樓下燒烤店。
~~~
? 沒到門口呢,小A搶先喊道“服務員,來只烤雞翅,來串烤羊肉!”,小B一看自己喊晚了,處于“程序猿”的職業精神,直接喊了一句“Call A”。“小哥,在北京,要講禮貌啊,不要說臟話!”服務員小李不慌不忙的說道。“啊,那個,剛才說的不是臟話,意思是“同上””,小B還自嘲一句“唉,程序猿的悲哀啊!”。。。服務員笑了笑,去通知燒烤老王了。這時磨嘰的小C才到,看到一頭郁悶的小B直接忽視,顯然了他的性格。“服務員,來只烤雞翅,來串烤羊肉!”。服務員小張“好的,請稍等。”,也去通知老王去了。
? 話說,三個程序猿干坐著等,那肯定是閑不住的。小B,憋不住了,
???“話說,咱們這也是進京趕考,你們說明天的考試能不能碰到原題呢?”。
???“每年都有一道相近的原題”。小A答道。
???“可憐我的設計模式不怎么會呢,下午題怎么過啊。”
???“學過三層嗎?”
???“學過啊,想當年,我學三層時,那可謂是。。。。哎呀,別打了,打傻了你們賠的起嗎”。
???“就你那智商,本來就是負”
???“切,隨便考,看看我會不會!”
? “那你說說我們現在遇到的三層吧”一直不語的小C說道。
? “不許說服務員-廚師-采購員這個版本。”小A搶先將了小B一軍。
? “說就說。who怕who啊。”,小B,嘴上強硬,心里實則有點發虛。沉下氣來,仔細想了想。不理睬小A的中途搗亂,5分鐘過后,“有了!”
? “你有了?恭喜恭喜啊!什么時候出生??哈哈哈哈~”小A得瑟的笑著。
? “去你的,說正題。話說,這個三層就拿我們做實驗吧。我們三個就是表示層,剛才那兩個服務員是業務邏輯層,而烤肉的師傅就是數據訪問層”。頓了頓,繼續說,“我們只管點燒烤和吃,服務員管通知,上菜,結算,而烤肉師傅則只負責烤肉”。每個角色,顧客換來換取,服務員也換,烤肉師傅也可以換,不管怎么變化,只要這個結構不變,就沒有問題。
? “這是您三位的烤羊肉和烤雞翅,請慢用!”服務員小李把燒烤給端上來了。
? “先吃先吃”,小A和小B爭著搶大的吃。
? “嗯,說的不錯,回去把這個用代碼實現了哈”,小C拿起剩余的那只雞翅膀也啃了起來。。。
【時間:2012年5月25日?20:00???地點:北京西三環某賓館】
? “吃完了,該工作了”小C看到打算躺下看電視的小B說道。
? “什么工作?”
? “當然是寫代碼了,你不會又把任務給吃了吧”
? “這小子肯定不會,你就放過他吧”小A諷刺道。
? “誰說不會的,等著”。小B翻開自己的筆記本,開始噼里啪啦的敲打著。。。
? 3分鐘過去后。。。
? "寫出來了,請看"
~~~
static void Main(string[] args)
{
Console.WriteLine("小A:來只烤雞翅");
Console.WriteLine("服務員1:烤雞翅一只");
Console.WriteLine("烤肉師傅:烤雞翅");
Console.WriteLine("");
Console.WriteLine("小A:來只烤羊肉");
Console.WriteLine("服務員1:烤羊肉一串");
Console.WriteLine("烤肉師傅:烤羊肉");
Console.WriteLine("");
Console.WriteLine("小B:來只烤雞翅");
Console.WriteLine("服務員1:烤雞翅一只");
Console.WriteLine("烤肉師傅:烤雞翅");
Console.WriteLine("");
Console.WriteLine("小B:來只烤雞翅");
Console.WriteLine("服務員1:烤雞翅一只");
Console.WriteLine("烤肉師傅:烤雞翅");
Console.WriteLine("");
Console.WriteLine("小C:來只烤羊肉");
Console.WriteLine("服務員2:烤羊肉一串");
Console.WriteLine("烤肉師傅:烤羊肉");
Console.WriteLine("");
Console.WriteLine("小C:來只烤雞翅");
Console.WriteLine("服務員2:烤雞翅一只");
Console.WriteLine("烤肉師傅:烤雞翅");
Console.WriteLine("");
Console.ReadLine();
}
~~~

?
? “不是吧,過程式的代碼啊,虧你還是考軟考的人,真是給我丟臉哎!”一向不怎么鄙視別人的小C也禁不住開始發表感嘆!
? “他就是個吃貨,把面向對象全吃了,哈哈”小A幸災樂禍道。
? “切,別著急啊,開個玩笑,這是先讓你們看看最終的結果。等著啊,下面就是面向對象版的”
? 10分鐘過去后。。
? “啊,老天,經過扼殺了我N+1個腦細胞,終于做出來了”小B悲嘆道。

顧客類:
~~~
using Servers;
namespace User
{
/// <summary>
/// 顧客類
/// </summary>
class User
{
string name;
Servers.Servers server;
public User(string name)
{
this.name = name;
}
public void SetServer(string name)
{
this.server = new Servers.Servers(name);
}
public void Bake()
{
Console.WriteLine(name+":來只烤雞翅");
server.KaoJiChi();
Console.WriteLine();
Console.WriteLine(name + ":來串烤羊肉");
server.KaoYangRou();
Console.WriteLine();
}
static void Main(string[] args)
{
User a = new User("顧客小A");
User b = new User("顧客小B");
a.SetServer("服務員小李");
b.SetServer("服務員小李");
a.Bake();
b.Bake();
User c = new User("顧客小C");
c.SetServer("服務員小張");
c.Bake();
Console.ReadLine();
}
}
}
~~~
服務員類:
~~~
using Cooks;
namespace Servers
{
/// <summary>
/// 服務員類
/// </summary>
public class Servers
{
string name;
Cooks.Cooks cook=new Cooks.Cooks("烤肉老王");
public Servers(string name)
{
this.name = name;
}
/// <summary>
/// 烤羊肉
/// </summary>
public void KaoYangRou()
{
Console.WriteLine(name + ":烤羊肉一串");
cook.BakeMutton();
}
/// <summary>
/// 烤雞翅
/// </summary>
public void KaoJiChi()
{
Console.WriteLine(name + ":烤雞翅一只");
cook.BakeChickenWing();
}
}
}
~~~
烤肉者類:
~~~
namespace Cooks
{
public class Cooks
{
string name;
public Cooks(string name)
{
this.name = name;
}
/// <summary>
/// 烤羊肉
/// </summary>
public void BakeMutton()
{
Console.WriteLine(name +":烤羊肉");
}
/// <summary>
/// 烤雞翅
/// </summary>
public void BakeChickenWing()
{
Console.WriteLine(name + ":烤雞翅");
}
}
}
~~~

???“勉勉強強吧,這樣顧客在變化中,服務員在變化,就連烤肉師傅也可以換,這些變化都不會影響整個業務流程。每層的變化都是獨立的,不會對其他的有影響。這就是人們常說的“解耦”。”小C總是高深莫測的樣子。扶了扶眼睛,繼續說道,
? “其實利用分層,不光是解耦,還是可以快速開發。一個項目,分好多人,有團隊的每個人去并發的開發一層,可以節約大量的時間。當然復用也是很有幫助的。”
? “哈,這次吃烤肉沒白吃啊,居然又邂逅三層了,又練習了對三層的應用,嗯,收獲不小 ,希望明天考試也這樣順利就好了”小B發著感慨。
? “不早了,都睡覺了,明天還要考試呢”小C提醒道。
? “等會等會,我還沒有看完電視呢!”中途跑去看電視的小A嚷嚷著。
? “現在網絡多發達啊,電視劇都放到網絡上了,只要你在任何時間,任何地點,任何一臺可以聯網的機子,你就可以看想看的電視劇了,完全不受約束。”小B顯擺的說道。突然眼睛一亮,
? “又是三層!!”小B和小C同時喊道。然后相互望了一眼,哈哈大笑起來。
? “神經,睡覺了!”小A受不了他們,躺下進入 了夢鄉。。。。?