Observer 模式在eHR中的应用

博客展示了Observer模式在eHR中的应用代码。定义了抽象主题ISubject和抽象观察者IObserver接口,实现了组织架构变化的观察者OrgChgObserver和主题OrgChgSubject,通过主类MainClass演示了添加观察者、通知观察者的过程,体现了Observer模式在组织架构变动时的应用。
    接触模式应该是在大三的时候,那时候感觉是模式让我真正的认识到了OO,现在毕业了,也工作有半年了,终于体会到了“商业特色的软件开发”了,根本就没有多余的时间去考虑运用什么模式、怎样使系统可扩展性更强、如何重构。哎!mo办法啊(看过天下无贼的应该能听懂吧)!
    最近稍闲了点,所以想重拾一下以前学的知识,这不就拿Observer模式开蒜了,废话少说,来吧!
    
    一个软件系统应该存在着各式各样的依赖,小系统尚且如此,大的商业系统当然以来更加复杂。我举一个在eHR(人力资源管理)系统中的依赖关系:
    1.组织架构的修改要导致绩效考核系统中签核人的修改。

    现在将这段代码进行一下重构,在这个依赖关系里可以抽象出下面几个对象:
    1.抽象主题:ISubject
    2.具体主题:OrgChgSubject
    3.抽象观察者:IObserver
    4.观察者:OrgChgObserver

    实现如下:
ExpandedBlockStart.gifContractedBlock.gif/**//// <summary>
InBlock.gif    
/// 抽象主题,所有的观察者模式中的主题必须继承该主题。
ExpandedBlockEnd.gif    
/// </summary>

None.gif    public interface ISubject
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 添加观察者
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        void AttachObserver(IObserver observer);
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 分离观察者
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        void DetachObserver(IObserver observer);
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 通知观察者
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        void NotifyObservers();
ExpandedBlockEnd.gif    }

ExpandedBlockStart.gifContractedBlock.gif
/**//// <summary>
InBlock.gif    
/// 抽象观察者,所有的观察者对象需实现该接口。
ExpandedBlockEnd.gif    
/// </summary>

None.gif    public interface IObserver
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 抽象观察者的更新方法,接收到通知后执行该方法
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        void Update();
ExpandedBlockEnd.gif    }

ExpandedBlockStart.gifContractedBlock.gif
/**//// <summary>
InBlock.gif    
/// 组织架构变化的观察者
ExpandedBlockEnd.gif    
/// </summary>

None.gif    public class OrgChgObserver:IObserver
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
InBlock.gif        
public OrgChgObserver()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//
InBlock.gif            
// TODO: 在此处添加构造函数逻辑
InBlock.gif            
//
ExpandedSubBlockEnd.gif
        }

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IObserver 成员#region IObserver 成员
InBlock.gif
InBlock.gif        
public void Update()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"*******绩效系统的观察者*******");
InBlock.gif            Console.WriteLine(
"1.已经接受到组织改动主题的通知");
InBlock.gif            Console.WriteLine(
"2.更新绩效管理系统的签核人");
InBlock.gif            Console.WriteLine(
"3.更新完毕");
InBlock.gif            Console.WriteLine(
"*****************************");
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
ExpandedBlockEnd.gif    }

ExpandedBlockStart.gifContractedBlock.gif
/**//// <summary>
InBlock.gif    
/// 组织架构变化主题
ExpandedBlockEnd.gif    
/// </summary>

None.gif    public class OrgChgSubject:ISubject
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
InBlock.gif        
private ArrayList observers;
InBlock.gif        
public OrgChgSubject()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//
InBlock.gif            
// TODO: 在此处添加构造函数逻辑
InBlock.gif            
//
InBlock.gif
            observers=new ArrayList();
ExpandedSubBlockEnd.gif        }

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
ISubject 成员#region ISubject 成员
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 添加观察者
InBlock.gif        
/// </summary>
ExpandedSubBlockEnd.gif        
/// <param name="observer"></param>

InBlock.gif        public void AttachObserver(IObserver observer)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            observers.Add(observer);
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 分离观察者
InBlock.gif        
/// </summary>
ExpandedSubBlockEnd.gif        
/// <param name="observer"></param>

InBlock.gif        public void DetachObserver(IObserver observer)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            observers.Remove(observer);
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 通知注册该主题的观察者
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        public void NotifyObservers()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"*******组织架构改动主题*******");
InBlock.gif            Console.WriteLine(
"1.组织架构已经发生改变!");
InBlock.gif            Console.WriteLine(
"*****************************");
InBlock.gif            
for(int i=0;i<observers.Count;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                IObserver o
=(IObserver)observers[i];
InBlock.gif                o.Update();
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

ExpandedBlockEnd.gif    }

ExpandedBlockStart.gifContractedBlock.gif
/**//// <summary>
InBlock.gif    
/// 主类
ExpandedBlockEnd.gif    
/// </summary>

None.gif    public class MainClass
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
InBlock.gif        [STAThread]
InBlock.gif        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            OrgChgSubject o_OrgChgSubject
=new OrgChgSubject();
InBlock.gif            OrgChgObserver o_OrgChgObserver
=new OrgChgObserver();
InBlock.gif            o_OrgChgSubject.AttachObserver(o_OrgChgObserver);
InBlock.gif            o_OrgChgSubject.NotifyObservers();
InBlock.gif            Console.ReadLine();
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

    运行结果:
    observer.jpg
    可以看出实际上组织架构的变动必然会导致很多的地方要求随之相应的变动,所以各个模块都可以实现各自的Observer,实现自己的Update函数。
   很简单不是吗?不过还有一些边缘问题要解决:
    1.观察者在不同模块怎么办?即处于不同的DLL?
    2.如何将DEM事件机制运用进去?
    3.是否可以与MOP整合?
    。。。。。
    今天没有时间了,先写到这里吧。

转载于:https://www.cnblogs.com/Masterpiece/archive/2004/12/21/79942.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值