2004年12月21日

DEM 机制实现Observer模式

    在上一篇Observer 模式在eHR中的应用中提到了Observer模式在eHR中的应用,其中处理方式是用的传统的设计原则,但是无论在java中还是c#中,都有了DEM模型,所以采用DEM模型来实现Observer模式会更快,切在扩展性上也有一定的提高(比如不需要必须在Observer中实现Update函数,而只要符合代理约定即可)。
    下面我就用DEM模型来重新修改程序 
   
using System;

namespace Observer.DEMObserver
{
    
/// <summary>
    
/// DEMObserverTest 的摘要说明。
    
/// </summary>

    
    
public class DEMObserverTest
    
{
        
public DEMObserverTest()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }

        
        
/// <summary>
        
/// 虚拟主题
        
/// </summary>

        public class Subject
        
{

            
public delegate void UpdateDelegate();
            
public event UpdateDelegate UpdateHandler;

            
/// <summary>
            
/// 添加观察者
            
/// </summary>
            
/// <param name="observerDelegate"></param>

            public void AttachObserver(UpdateDelegate observerDelegate)
            
{
                UpdateHandler
+=observerDelegate;
            }


            
/// <summary>
            
/// 分离观察者
            
/// </summary>
            
/// <param name="observerDelegate"></param>

            public void DetachObserver(UpdateDelegate observerDelegate)
            
{
                UpdateHandler
-=observerDelegate;
            }


            
/// <summary>
            
/// 通知方法
            
/// </summary>

            public void NotifyObservers()
            
{
                
if(UpdateHandler!=null)
                
{
                    UpdateHandler();
                }

                Console.ReadLine();
            }

        }


        
/// <summary>
        
/// 组织架构修改主题
        
/// </summary>

        public class OrgChgSubject:Subject
        
{
        }


        
/// <summary>
        
/// 组织架构变化观察者
        
/// </summary>

        public class OrgChgObserver
        
{
            
public void UpdateDelegateImplement()
            
{
                Console.WriteLine(
"*******组织架构改动主题*******");
                Console.WriteLine(
"1.组织架构已经发生改变!");
                Console.WriteLine(
"*****************************");
                Console.WriteLine(
"*******绩效系统的观察者*******");
                Console.WriteLine(
"1.已经接受到组织改动主题的通知");
                Console.WriteLine(
"2.更新绩效管理系统的签核人");
                Console.WriteLine(
"3.更新完毕");
                Console.WriteLine(
"*****************************");
            }

        }

    }

}

    在另外的一个主类中的DEM调用代码如下:
using System;

namespace Observer
{
    
/// <summary>
    
/// 主类
    
/// </summary>

    public class MainClass
    
{
        [STAThread]
        
static void Main(string[] args)
        
{
            
非DEM实现

            
DEM实现
        }

    }

}

posted @ 2004-12-21 16:11 纯爷们 阅读(329) 评论(0) 编辑

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 成员

    }

/// <summary>
    
/// 组织架构变化主题
    
/// </summary>

    public class OrgChgSubject:ISubject
    
{
        
private ArrayList observers;
        
public OrgChgSubject()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
            observers=new ArrayList();
        }


        
ISubject 成员
    }

/// <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整合?
    。。。。。
    今天没有时间了,先写到这里吧。

posted @ 2004-12-21 11:03 纯爷们 阅读(909) 评论(5) 编辑