Observer 模式在eHR中的应用
生活随笔
收集整理的這篇文章主要介紹了
Observer 模式在eHR中的应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
接觸模式應該是在大三的時候,那時候感覺是模式讓我真正的認識到了OO,現在畢業了,也工作有半年了,終于體會到了“商業特色的軟件開發”了,根本就沒有多余的時間去考慮運用什么模式、怎樣使系統可擴展性更強、如何重構。哎!mo辦法啊(看過天下無賊的應該能聽懂吧)!
??? 最近稍閑了點,所以想重拾一下以前學的知識,這不就拿Observer模式開蒜了,廢話少說,來吧!
????
??? 一個軟件系統應該存在著各式各樣的依賴,小系統尚且如此,大的商業系統當然以來更加復雜。我舉一個在eHR(人力資源管理)系統中的依賴關系:
??? 1.組織架構的修改要導致績效考核系統中簽核人的修改。
??? 現在將這段代碼進行一下重構,在這個依賴關系里可以抽象出下面幾個對象:
??? 1.抽象主題:ISubject
??? 2.具體主題:OrgChgSubject
??? 3.抽象觀察者:IObserver
??? 4.觀察者:OrgChgObserver
??? 實現如下: /**////?<summary>
????///?抽象主題,所有的觀察者模式中的主題必須繼承該主題。
????///?</summary>
????public?interface?ISubject
????{
????????/**////?<summary>
????????///?添加觀察者
????????///?</summary>
????????void?AttachObserver(IObserver?observer);
????????/**////?<summary>
????????///?分離觀察者
????????///?</summary>
????????void?DetachObserver(IObserver?observer);
????????/**////?<summary>
????????///?通知觀察者
????????///?</summary>
????????void?NotifyObservers();
????}
/**////?<summary>
????///?抽象觀察者,所有的觀察者對象需實現該接口。
????///?</summary>
????public?interface?IObserver
????{
????????/**////?<summary>
????????///?抽象觀察者的更新方法,接收到通知后執行該方法
????????///?</summary>
????????void?Update();
????}
/**////?<summary>
????///?組織架構變化的觀察者
????///?</summary>
????public?class?OrgChgObserver:IObserver
????{
????????public?OrgChgObserver()
????????{
????????????//
????????????//?TODO:?在此處添加構造函數邏輯
????????????//
????????}
????????IObserver?成員#region?IObserver?成員
????????public?void?Update()
????????{
????????????Console.WriteLine("*******績效系統的觀察者*******");
????????????Console.WriteLine("1.已經接受到組織改動主題的通知");
????????????Console.WriteLine("2.更新績效管理系統的簽核人");
????????????Console.WriteLine("3.更新完畢");
????????????Console.WriteLine("*****************************");
????????}
????????#endregion
????}
/**////?<summary>
????///?組織架構變化主題
????///?</summary>
????public?class?OrgChgSubject:ISubject
????{
????????private?ArrayList?observers;
????????public?OrgChgSubject()
????????{
????????????//
????????????//?TODO:?在此處添加構造函數邏輯
????????????//
????????????observers=new?ArrayList();
????????}
????????ISubject?成員#region?ISubject?成員
????????/**////?<summary>
????????///?添加觀察者
????????///?</summary>
????????///?<param?name="observer"></param>
????????public?void?AttachObserver(IObserver?observer)
????????{
????????????observers.Add(observer);
????????}
????????/**////?<summary>
????????///?分離觀察者
????????///?</summary>
????????///?<param?name="observer"></param>
????????public?void?DetachObserver(IObserver?observer)
????????{
????????????observers.Remove(observer);
????????}
????????/**////?<summary>
????????///?通知注冊該主題的觀察者
????????///?</summary>
????????public?void?NotifyObservers()
????????{
????????????Console.WriteLine("*******組織架構改動主題*******");
????????????Console.WriteLine("1.組織架構已經發生改變!");
????????????Console.WriteLine("*****************************");
????????????for(int?i=0;i<observers.Count;i++)
????????????{
????????????????IObserver?o=(IObserver)observers[i];
????????????????o.Update();
????????????}
????????}
????????#endregion
????}
/**////?<summary>
????///?主類
????///?</summary>
????public?class?MainClass
????{
????????[STAThread]
????????static?void?Main(string[]?args)
????????{
????????????OrgChgSubject?o_OrgChgSubject=new?OrgChgSubject();
????????????OrgChgObserver?o_OrgChgObserver=new?OrgChgObserver();
????????????o_OrgChgSubject.AttachObserver(o_OrgChgObserver);
????????????o_OrgChgSubject.NotifyObservers();
????????????Console.ReadLine();
????????}
????}
????運行結果:
????
??? 可以看出實際上組織架構的變動必然會導致很多的地方要求隨之相應的變動,所以各個模塊都可以實現各自的Observer,實現自己的Update函數。
???很簡單不是嗎?不過還有一些邊緣問題要解決:
??? 1.觀察者在不同模塊怎么辦?即處于不同的DLL?
??? 2.如何將DEM事件機制運用進去?
????3.是否可以與MOP整合?
??? 。。。。。
??? 今天沒有時間了,先寫到這里吧。
??? 最近稍閑了點,所以想重拾一下以前學的知識,這不就拿Observer模式開蒜了,廢話少說,來吧!
????
??? 一個軟件系統應該存在著各式各樣的依賴,小系統尚且如此,大的商業系統當然以來更加復雜。我舉一個在eHR(人力資源管理)系統中的依賴關系:
??? 1.組織架構的修改要導致績效考核系統中簽核人的修改。
??? 現在將這段代碼進行一下重構,在這個依賴關系里可以抽象出下面幾個對象:
??? 1.抽象主題:ISubject
??? 2.具體主題:OrgChgSubject
??? 3.抽象觀察者:IObserver
??? 4.觀察者:OrgChgObserver
??? 實現如下: /**////?<summary>
????///?抽象主題,所有的觀察者模式中的主題必須繼承該主題。
????///?</summary>
????public?interface?ISubject
????{
????????/**////?<summary>
????????///?添加觀察者
????????///?</summary>
????????void?AttachObserver(IObserver?observer);
????????/**////?<summary>
????????///?分離觀察者
????????///?</summary>
????????void?DetachObserver(IObserver?observer);
????????/**////?<summary>
????????///?通知觀察者
????????///?</summary>
????????void?NotifyObservers();
????}
/**////?<summary>
????///?抽象觀察者,所有的觀察者對象需實現該接口。
????///?</summary>
????public?interface?IObserver
????{
????????/**////?<summary>
????????///?抽象觀察者的更新方法,接收到通知后執行該方法
????????///?</summary>
????????void?Update();
????}
/**////?<summary>
????///?組織架構變化的觀察者
????///?</summary>
????public?class?OrgChgObserver:IObserver
????{
????????public?OrgChgObserver()
????????{
????????????//
????????????//?TODO:?在此處添加構造函數邏輯
????????????//
????????}
????????IObserver?成員#region?IObserver?成員
????????public?void?Update()
????????{
????????????Console.WriteLine("*******績效系統的觀察者*******");
????????????Console.WriteLine("1.已經接受到組織改動主題的通知");
????????????Console.WriteLine("2.更新績效管理系統的簽核人");
????????????Console.WriteLine("3.更新完畢");
????????????Console.WriteLine("*****************************");
????????}
????????#endregion
????}
/**////?<summary>
????///?組織架構變化主題
????///?</summary>
????public?class?OrgChgSubject:ISubject
????{
????????private?ArrayList?observers;
????????public?OrgChgSubject()
????????{
????????????//
????????????//?TODO:?在此處添加構造函數邏輯
????????????//
????????????observers=new?ArrayList();
????????}
????????ISubject?成員#region?ISubject?成員
????????/**////?<summary>
????????///?添加觀察者
????????///?</summary>
????????///?<param?name="observer"></param>
????????public?void?AttachObserver(IObserver?observer)
????????{
????????????observers.Add(observer);
????????}
????????/**////?<summary>
????????///?分離觀察者
????????///?</summary>
????????///?<param?name="observer"></param>
????????public?void?DetachObserver(IObserver?observer)
????????{
????????????observers.Remove(observer);
????????}
????????/**////?<summary>
????????///?通知注冊該主題的觀察者
????????///?</summary>
????????public?void?NotifyObservers()
????????{
????????????Console.WriteLine("*******組織架構改動主題*******");
????????????Console.WriteLine("1.組織架構已經發生改變!");
????????????Console.WriteLine("*****************************");
????????????for(int?i=0;i<observers.Count;i++)
????????????{
????????????????IObserver?o=(IObserver)observers[i];
????????????????o.Update();
????????????}
????????}
????????#endregion
????}
/**////?<summary>
????///?主類
????///?</summary>
????public?class?MainClass
????{
????????[STAThread]
????????static?void?Main(string[]?args)
????????{
????????????OrgChgSubject?o_OrgChgSubject=new?OrgChgSubject();
????????????OrgChgObserver?o_OrgChgObserver=new?OrgChgObserver();
????????????o_OrgChgSubject.AttachObserver(o_OrgChgObserver);
????????????o_OrgChgSubject.NotifyObservers();
????????????Console.ReadLine();
????????}
????}
????運行結果:
????
??? 可以看出實際上組織架構的變動必然會導致很多的地方要求隨之相應的變動,所以各個模塊都可以實現各自的Observer,實現自己的Update函數。
???很簡單不是嗎?不過還有一些邊緣問題要解決:
??? 1.觀察者在不同模塊怎么辦?即處于不同的DLL?
??? 2.如何將DEM事件機制運用進去?
????3.是否可以與MOP整合?
??? 。。。。。
??? 今天沒有時間了,先寫到這里吧。
轉載于:https://www.cnblogs.com/Masterpiece/archive/2004/12/21/79942.html
總結
以上是生活随笔為你收集整理的Observer 模式在eHR中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云中家园FTP搜索站点开通
- 下一篇: [团队公告]第二次技术交流主题征集