上班玩遊戲,老總是怎麼知道的呢?
注:以下反出現“同學”的地方都使用“C”代替,我自己使用“M”代替,老總“A”。
前些天一個同學告訴我:“我上班的時候玩遊戲,怎麼老總知道.難不成他在辦公室裏裝有監視器.”
“呵呵,這個很難說,不過應該是不會的.”M說:。
T:“那老總是怎麼知道我玩遊戲的呢?”
M:“這個問題還得好好研究下,或許他還可能真的是在辦公室的某處裝有攝像頭監視呢,哈哈!”
T:“是啊,我也這樣懷疑過,因爲辦公室裏出了我,別的同事玩遊戲他也知道。神了這!”
M:“那他不是一個人可以監視你門多個呀?也,他還玩得高級呢,還弄個一對多的關係出來了。而你辦公室裏的任何一個人玩遊戲他都能準確準時的逮住你們,你們老總夠強大的哈!”
M:“這讓我想起了軟件設計的知識。”
觀察者定義了對象間一對多的關係,當一個對象的狀態變化時,所有依賴它的對象都得到通知並且自動地更新。
T:“你是不是做軟件做瘋了,這也能和軟件設計拉上關係?別蝦扯了,說正事吧。”
M:“我說的就是正事呀,哎,你娃還是老脾氣不改,別人話都沒說完你就打斷別人自己來插上幾句,還是講點原則撒,讓別人說完了你在接到來。你先聽到,我說完了你在說。”
M:“你仔細看看我上面提到的軟件設計知識點,你們老總可以監視你們多個人,當你們玩遊戲他就可以準確準時的逮到你們,用程序來說就是當你們一玩遊戲的時候就調用了PlayGame()方法嗎?而當PlayGame()方法是被監視起的,當PlayGame()被調用的時候就會自動的通知監視者(你們老總),這樣很明顯,他就知道你們在拿他的錢吃飯不給他做事,反而在辦公室裏玩遊戲了,逮到你你就該着了。不過你也要調過頭想想,老總這樣做也是有原因的,畢竟他投資了資本出來是想得到回報的,是吧?”
T:“打住,打住。你呀,還不是老脾氣不改,還好意思說我。你看你,一說到軟件設計,你就巴不得一口氣把你掌握的東西唱完!”
M:“呵呵,彼此彼此!”
----面向對象設計模式[觀察者模式]
T:“說實話,我不做程序好多天,可我還是難忘曾經的那寫天!聽到你說面這樣說,我到是對這個軟件設計方案有點興趣了,你能不能說詳細點來聽聽?”
M:“行啊,難得你有這份興趣,我就用個示例來給你簡單的介紹下吧!”
T:“話說多個朋友多條路,呵呵,多個同學還多個聊天吹牛的,噓--小點聲,別讓那傢伙聽到了。”
M:“其實無論你是在使用.NET還是java開發,這兩個平臺的事件模型就是一個典型的觀察者模式的體現。我就以.NET平臺的C#語言來做個簡單示例介紹。”
M:“首先,我們需要定義一個委託,通過委託將兩個類的交互進行了綁定,當員工玩遊戲的方法PalyGame()調用後,觸發委託類型的PlayGame事件,而該事件將被委託給老總(admin)的呼叫老總(Notify)方法處理。”
/// <summary>
/// 定義委託
/// </summary>
public delegate void DelegateMonitorEmployee(object sender, CustomeEvetnArgs e);
M:“你是一個人,用面向對象的思想來說的話,那麼你就是一個對象吧?抽象的人類對象,在公司裏,你作爲一名員工,那我們就計算機語言來抽象出員工這個對象Employee,你要玩遊戲,而且在玩遊戲的時候還會被老總給逮住,那你得去做一個PlayGame方法吧,這裏我們很顯然需要定義一個委託類型的事件,把遊戲的方法Games()通過事件關聯起來。”
//員工類
public class Employee
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
/// <summary>
/// 委託類型的事件
/// </summary>
public event DelegateMonitorEmployee PlayGame;
public void Gages()
{
if (PlayGame != null)
{
CustomeEvetnArgs e = new CustomeEvetnArgs();
e.Name = this._name;
e.Age = this._age;
PlayGame(this, e);
}
}
}
T:“你上面CustomeEvetnArgs這是什麼玩意,以前我做程序的時候好象沒看到過這個東東,是不是自己定義的?”
M:“不錯的嗎?會發現問題了?不錯,CustomeEvetnArgs是自己定義的一個類,他繼承於系統EventArgs類,用來傳遞消息的,等會你就知道了,你玩遊戲就是通過它把你的的名字等信息傳遞到老總那去的。既然你這麼急着知道他是幹什麼的,那看看下面的定義。”
/// <summary>
/// 事件參數基類EventArgs專門用於傳遞事件數據
/// 定義了兩個成員,通過它可以傳遞兩個數據(Name,Age)
/// </summary>
public class CustomeEvetnArgs:EventArgs
{
string name = string.Empty;
public string Name
{
get { return name; }
set { name = value; }
}
int age = 0;
public int Age
{
get { return age; }
set { age = value; }
}
public CustomeEvetnArgs()
{ }
}
M:“下面我們來看看老總(Admin)類裏是怎麼處理的,當員工(Employee)玩遊戲(調用了PlayGame)的時候老總是怎麼得到通知的。”
//老總類
public class Admin
{
/// <summary>
/// 呼叫老總--
/// 通過CustomeEvetnArgs事件把玩遊戲的員工信息傳遞過來
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void Notify(object sender,CustomeEvetnArgs e)
{
StringBuilder resutl = new StringBuilder();
resutl.Append("員工:" + e.Name + " ");
resutl.Append("年齡:" + e.Age.ToString() + "歲 ");
resutl.Append("正在玩遊戲! ");
resutl.Append("時間:" + DateTime.Now.ToString());
Console.WriteLine(resutl);
}
}
M:“到這裏,整個監視過程我們就完全建立好了。現在是該做實驗的時候到了。老同學(Employee),你在去玩遊戲試試,看看老總(Admin)是不是可以通過我們上面花這麼多的功夫去建立的這個觀察(監視)你的系統呢?”
T:“你說得比唱得還好聽,就這麼幾十句代碼,有你說的那麼神嗎?不就不信,好,我去試試。”
--張三(呵呵,前面忘了說,我那同學叫張三,今年22歲了。)打開了電腦,遊戲啓動。
class Program
{
static void Main(string[] args)
{
Employee employee = new Employee();
employee.Name = "張三";
employee.Age = 22;
Admin admin = new Admin();
//通過DelegateMonitorEmployee將兩個類的交互進行了綁定,當employee.Games方法調用後,
//觸發PlayGame事件,而該事件將被委託給admin的Notify方法處理。
employee.PlayGame += new DelegateMonitorEmployee(admin.Notify);
employee.Gages();
}
}
--這裏,老總辦公室裏的警報聲響了,發出了信號;
--小張剛剛啓動遊戲,突然辦公室門開了。進來了一個“人(Admin)”。
A:“張三,你膽子夠大的嘛,昨天玩遊戲還罰款你100個大洋,你今天還趕玩?等會到我辦公室去我們聊一會!”
--哈哈,估計這次我這爲同學要被洗白。。。。期待被抄中ing.......
文章到處結束,希望大家多多支持。