NET框架中的 Observer 模式

应用场景:net 框架下的HttpModule (.net2.0 代码)

         先看一下 Observer 模式结构图:

 

    再看一下.net框架中的应用结构图

    关于HttpApplication.InitModules()函数的调用代码如下

 

1private void InitModules()
2{
3    //根据CONFIG文件中的配置来进行相关Module的创建并返回集合
4    this._moduleCollection = RuntimeConfig.GetAppConfig().HttpModules.CreateModules();  
5    this.InitModulesCommon();
6}

 

而这里的CreateModules所进行初始化的代码如下

 1internal HttpModuleCollection CreateModules()
 2{
 3    HttpModuleCollection modules = new HttpModuleCollection();
 4    foreach (HttpModuleAction action in this.Modules)   //
 5    {
 6        modules.AddModule(action.Entry.ModuleName, action.Entry.Create());
 7    }
 8    modules.AddModule("DefaultAuthentication", new DefaultAuthenticationModule());
 9    return modules;
10}

 

  
而.net1.0 下的代码相对应的是:

 1internal HttpModuleCollection CreateModules()
 2{
 3    HttpModuleCollection modules = new HttpModuleCollection();
 4    foreach (ModulesEntry entry in this._list)  //arraylist类型,因此此处要存在转型操作
 5    {
 6        modules.AddModule(entry.ModuleName, entry.Create());
 7    }
 8    modules.AddModule("DefaultAuthentication", new DefaultAuthenticationModule());
 9    return modules;
10}

 

    看来差别并不大, 因此不就多说什么了。

 

 
//内部属性 HttpModules,完成从<httpModules>配置节点读取信息关初始化相关集合的任务,
//注.net1.0 框架下的代码在此处不完全相同,1.0下用 HttpModulesConfiguration,来返回集合。

1internal HttpModulesSection HttpModules
2{
3    get
4    {
5        return (HttpModulesSection) this.GetSection("system.web/httpModules", typeof(HttpModulesSection), 
6 ResultsIndex.HttpModules);
7    }
8}
9

//开始运行module中的init函数

 1private void InitModulesCommon()
 2{
 3    int count = this._moduleCollection.Count;
 4    for (int i = 0; i < count; i++)
 5    {
 6        this._currentModuleCollectionKey = this._moduleCollection.GetKey(i);
 7        this._moduleCollection[i].Init(this);  //此处代码将相关的module中的init函数
 8    }
 9    
10    .
11}

 

    思考:另外本人觉得httphandler实现所采用的模式与httpmodule方式不同。大家可以看一下HttpApplication类中的
ApplicationStepManager.BuildSteps(WaitCallback stepCallback)方法(会在HttpApplication.InitInternal被调用)中
有这个一段:

    ....
    steps.Add(new HttpApplication.MapHandlerExecutionStep(app)); 
    ....

         而MapHandlerExecutionStep,而它会调用自身的Execute(),近而调用MapHttpHandler--->GetAppLevelHandlerMapping以从
webconfig结点中加载匹配条件的处理程序绑定。因此从这方面,buildstep更像是一组装起来的流水线。而httphandler只是提供
一个零件而已, 但这个流水线从我个人角度看倒有点象是个"异步执行"的Observer结构,这里就不再分析了:)

 

          注:关于web.config中的相关ADD,REMOVE,Clear 等属性初始化设置可以参见ConfigurationElement类中的this[Configurati
onProperty prop]属性(get将会初始化或返回相应的HttpModuleActionCollection集合,并提供给HttpApplication.CreateModules()
使用),以及ConfigurationSectionCollection类相关的方法。
         另外说明的是HttpModulesSection 的派生于ConfigurationSection,而ConfigurationSection派生于ConfigurationElement。

         相关联的类如ConfigurationProperty,ConfigurationPropertyCollection()基本上都是类似于数据结构的封装,看一下代码
大家就该清楚了。

        总体上说,Observer结构应该是一种很好掌握的模式,也很好理解。这里再把这种模式的意图和适用性拷贝如下,以加深理解:

        意图:  定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 
        适用性: 
            1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立
               地改变和复用。 
             2.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 
             3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

时间: 2024-08-02 18:42:12

NET框架中的 Observer 模式的相关文章

在J2EE中实现Observer模式

引言: 设计模式是经验的文档化.它是对被用来在特定场景下解决一般设计问题的类和相互通信 的对象的描述.更通俗的来说,它是一个问题/解决方案对.一旦我们掌握了设计模式,就等 于拥有了一支强有力的专家队伍.它甚至能够使面向对象的新手利用前人的经验找出职责明 确的类和对象,从而获得优雅的解决方案.由于设计模式也是重构的目标,如果在设计的初 期适当地引入设计模式,可以减少重构的工作量. 但是,我们也不能陷入模式的陷阱,为了使用模式而去套模式,那样会陷入形式主义.我 们在使用模式的时候,一定要注意模式的意

.NET2.0框架中的AbstractFactory模式

我这里只是从别的角度阐述一下AbstractFactory在这种应用场景下的发展,内容不多,希望大家见谅. 1. DbService 是我看到的第一个使用抽象工厂模式设计的数据库链接类.其实在几年前网上就有人写了这个东西,代码不多,但应用的背景和设计思路与永红(http://www.cnblogs.com/Yahong111/archive/2007/07/18/822946.html) 的思路非常相似.大家可以去网上搜一搜就知道了. 2. 微软也采用了这种模式在他们的NET2.0框架中.我甚至

Observer模式深度探索

server [简介]微软顶级技术大师Jeffrey Richter的作品,一向是不容错过的.为了帮助开发者这篇专论Observer模式的文章也不例外.Observer模式是经典设计模式中应用最为广泛也最为灵活多变的模式之一.本文在.NET技术框架下深入发掘了Observer模式的内涵,值得细细品味. 虽然设计模式并不是万能丹,但确实是一个非常强大的工具,开发人员或架构师可使用它积极地参与任何项目.设计模式可确保通过熟知和公认的解决方案解决常见问题.模式存在的事实基础在于:大多数问题,可能已经有

设计模式中的迭代器模式在Cocoa Touch框架中的使用_IOS

基本理解迭代器模式(Iterrator):提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该元素的内部表示. 当你访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式. 你需要对聚集有多种方式遍历时,可以考虑用迭代器模式. 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据. 迭代器定义了一个用于访问集合元素并记录当前元素的接口. 不同的迭代器可以执行不同的迭代策略.外

设计模式开发中的备忘录模式在iOS应用开发中的运用实例_IOS

何为备忘录模式?     在响应某些事件时,应用程序需要保存自身的状态,比如当用户保存文档或程序退出时.例如,游戏退出之前,可能需要保存当前会话的状态,如游戏等级.敌人数量.可用武器的种类等.游戏再次打开时,玩家可以从离开的地方接着玩.很多时候,保存程序的状态真的不需要什么特别巧妙的方法.任何简单有效的方法都可以,但是同时,保存信息应该只对原始程序有意义.原始程序应该是能够解码它所保存文档中的信息的唯一实体.这就是备忘录模式应用于游戏.文字处理等程序的软件设计中的方式,这些程序需要保存当前上下文

iOS应用开发中运用设计模式中的组合模式的实例解析_IOS

何为组合模式?    组合模式让我们可以把相同基类型的对象组合到树状结构中,其中父节点包含同类型的子节点.换句话说,这种树状结构形成"部分--整体"的层次结构.什么是"部分--整体"的层次结构呢?它是既包含对象的组合又包含叶节点的单个对象的一种层次结构.每个组合体包含的其他节点,可以是叶节点或者其他组合体.这种关系在这个层次结构中递归重复.因为每个组合或叶节点有相同的基类型,同样的操作可应用于它们中的每一个,而不必在客户端作类型检查.客户端对组合与叶节点进行操作时可

Java Q&amp;amp;A: 使用Observer模式(转)

Java Q&A: 使用Observer模式A:我想在自己的Java程序中使用Observer模式.基于此,能否提供某些示例代码来演示如何去做?Q:正如面向对象编程有助于代码复用一样,设计模式可以促进设计复用.确实,设计模式可以让你复用那些正确的.成熟的设计.但近来,批评设计模式的声音越来越多.批评者指出,缺乏经验的开发者会很容易地掉进 "模式陷阱" 之中.模式陷阱让缺乏经验的开发者迷失了方向.因而,他们在处理问题时不是去寻找可能存在的最好方案,而把最终目标集中在尽可能地实现更

实例讲解设计模式中的命令模式在iOS App开发中的运用_IOS

命令模式封装一个请求或行为作为一个对象.封装的请求比原的更加灵活,可以在对象之间传递,储存,动态修改,或放入一个队列. 那么让我们简要的说一下命令模式的特点. 它能比较容易地设计一个命令队列: 在需要的情况下,可以较容易地将命令记入日志: 允许接收请求地一方决定是否要否决请求: 可以容易地实现对请求地撤销和重做: 由于加进新地具体命令类不影响其他的类,因此增加新的具体命令类很容易: 把请求一个操作的对象与知道怎么执行一个操作的对象分隔开. 下面给出基本的类结构图: 上面这张图是命令模式的类结构的

探索JSF框架中使用的设计模式

js|设计 设计模式可以帮助用户在更高层次上抽象细节,更好地理解体系结构.如果比较熟悉 GoF 设计模式和 JavaServer Faces (JSF) 框架,本文可以帮助您洞察 JSF 框架中使用的设计模式,深入理解其工作原理. 本文探讨了 JSF 框架中使用的设计模式.详细讨论的设计模式包括 Singleton.Model-View-Controller.Factory Method.State.Composite.Decorator.Strategy.Template Method 和 O