[浪子学编程][MS Enterprise Library]ObjectBuilder之设计模式(一):策略模式

简介:

ObjectBuilder之设计模式():策略模式  

                                                                         Written by 浪子

 

摘要
 

剑是剑,刀是刀。

剑可以杀人,刀也可以杀人,所以它们都能杀人。

不管拿在手里的是剑,还是刀,只要告诉它杀人,它自己会选择合适的方式:剑刺,刀劈……


    
 

前言

    回顾“ObjectBuilder内功心法之中国特色”一文之办证部门:


              

 

ObjectBuilder 之创建策略(BuilderStrategy)

      

首先,需要符合一定的规范才能参与对象的创建流程,犹如必须拥有办证职能的部门才能参与办证的流程一样。

创建策略接口规范,必须有创建方法(BuildUp)、销毁方法(TearDown):


        
 

有了指导策略之后,为了处理方便,我们先暂定一些基础的参考方法:定义一个抽象的创建策略基类


        
 

    “当手头的项目越来越大,对象也越来越多,对象之间的交互也越来越复杂,这时,简单的对象创建过程已经渐渐的不能适应这种情况了。比如,对象之间存在着依赖关系,那么对象的创建次序就显得很重要。一个对象被创建,需要哪些条件?”

 

    有些事情往往看起来简单,但是实际操作起来可能完全不是想象的那样,好比办一张身份证,收到办证通知之后,去人才中心领取户口页,再去指定照相馆照证件照、交钱,然后一段时间后才能到户口所在公安局用旧证换回新证。但是手续再多,我需要去的这些部门肯定都更办证有关,也就都具有办证的职能。

 

    此时,创建的过程就会分出好多阶段PreCreation(预创建阶段)、Creation(创建阶段)、Initialization(对象初始化阶段)、PostInitialization(初始化完成阶段),每个阶段会做些具体的创建过程,但是不管怎么创建,它们都必须符合创建策略接口规范,必须有创建方法(BuildUp)、销毁方法(TearDown):

 

预创建阶段

TypeMappingStrategy : 类型映射策略

SingletonStrategy: 单例策略

ConstructorReflectionStrategy: 构造器反射策略

PropertyReflectionStrategy: 属性反射策略

MothodReflectionStrategy: 方法反射策略

创建阶段

CreationStrategy: 创建策略

初始化阶段

PropertySetterStrategy: 属性设置器策略

MothodExecutionStrategy: 方法执行策略

初始化完成阶段

BuilderAwareStrategy: 创建器感知策略

 

        
 

    办证的部门越多,各个部门有各自需要做的事情,如果没有一个统一的指导方针,顶层的领导将一无所知,整个办证的过程就陷入混乱状况。所以作为顶层的领导将会发布一个做事的方针规范(办证方针),做到 “上有政策”。 而因为各个部门的实际情况不一样,所以遵循着领导的指示之外,还需要做适当的融会贯通,正所谓“下有对策”。


        
 


        当过程越来越复杂,参与的对象也越来越多,同样也需要做到“上有政策,下有对策”。

 

        定义对象创建方针,是个空接口


       

        各个具体创建策略创建自己的具体创建方针


        
 

        每个具体的创建策略在创建对象的时候调用自己的具体创建方针:

     

public  class TypeMappingStrategy : BuilderStrategy
{
    public  override  object BuildUp(IBuilderContext context, Type t,  object existing,  string id)
    {
      DependencyResolutionLocatorKey result =  new DependencyResolutionLocatorKey(t, id);

       // 是否有自己的具体创建方针
      ITypeMappingPolicy policy = context.Policies.Get<ITypeMappingPolicy>(t, id);

       // 有自己的创建方针,则执行
       if (policy !=  null)
       {
         result = policy.Map(result);
         TraceBuildUp(context, t, id, Properties.Resources.TypeMapped, result.Type, result.ID ?? "(null)");
         Guard.TypeIsAssignableFromType(t, result.Type, t);
      }

       // 执行创建动作
       return  base.BuildUp(context, result.Type, existing, result.ID);
   }
}

 

    有了抽象策略角色(BuilderStrategy),也有了具体策略角色(TypeMappingStrategy、……),还缺少一个环境角色。所以我们需要构造一个环境角色。

    在办理身份证的过程中,我指定了一个执行方案,这个方案执行了策略,它就充当了整个环节中的环境角色。

    在ObjectBuilder的环境中,IBuilder定义了ObjectBuilder所需要的环境角色的接口规范:


        
 

BuilderBase定义了一个抽象的基类,Builder定义了一个真正的环境对象。默认了一系列的策略调用顺序:

             

public Builder(IBuilderConfigurator<BuilderStage> configurator)
{
    // 类型映射策略            
   Strategies.AddNew<TypeMappingStrategy>(BuilderStage.PreCreation);
    // 单例策略
   Strategies.AddNew<SingletonStrategy>(BuilderStage.PreCreation);
    // 构造器反射策略
   Strategies.AddNew<ConstructorReflectionStrategy>(BuilderStage.PreCreation);
    // 属性反射策略
   Strategies.AddNew<PropertyReflectionStrategy>(BuilderStage.PreCreation);
    // 方法反射策略
   Strategies.AddNew<MethodReflectionStrategy>(BuilderStage.PreCreation);
    // 创建策略
   Strategies.AddNew<CreationStrategy>(BuilderStage.Creation);
    // 属性设置器策略
   Strategies.AddNew<PropertySetterStrategy>(BuilderStage.Initialization);
    // 方法执行策略
   Strategies.AddNew<MethodExecutionStrategy>(BuilderStage.Initialization);
    // 创建器感知策略
   Strategies.AddNew<BuilderAwareStrategy>(BuilderStage.PostInitialization);
   Policies.SetDefault<ICreationPolicy>( new DefaultCreationPolicy());
    if (configurator !=  null)
      configurator.ApplyConfiguration( this);
}

 

        当然这些是ObjectBuilder默认的一个策略过程,我们仍然可以做自己的扩展,比如DataAccess Block里面的:(关于ObjectBuilder的扩展以后再细说)

 

static EnterpriseLibraryFactory()
{
   builder =  new BuilderBase<BuilderStage>();

   builder.Strategies.AddNew<ConfigurationNameMappingStrategy>(BuilderStage.PreCreation);
   builder.Strategies.AddNew<SingletonStrategy>(BuilderStage.PreCreation);
   builder.Strategies.AddNew<ConfiguredObjectStrategy>(BuilderStage.PreCreation);
   builder.Strategies.AddNew<InstrumentationStrategy>(BuilderStage.PostInitialization);

}

 

结束语

       综上所述,ObjectBuilder的创建策略(BuilderStrategy)已经具有了策略模式的3个基本备对象

  •  环境角色
  • 抽象策略角色
  • 具体策略角色

 

           我们温习一下策略模式的定义:

    “策略模式是对算法的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以互换。”

    ObjectBuilder的创建策略(BuilderStrategy),但是他们却不是用来互换的,而是互相补充互相完善了,所以应该是一系列的连贯动作,看起来好像并不完全符合策略模式的定义。

       毛主席很早就教导过我们:团结就是力量。所以孤立存在的一个创建策略(BuilderStrategy)并不一定能解决问题,ObjectBuilder还需要用责任链模式把这一系列的创建策略组织起来才能完成一个对象的创建过程

 

to be continued……

 

 

―――――――――――――――――――――――――――――――――――――――――――――

参考资料:

       吕震宇老师之设计模式(22)-Strategy Pattern

       niwalker的专栏之ObjectBuilder技术内幕

 

                           

分类: 1.首页原创精华.NET区123,IoC / DI,浪子学编程



本文转自浪子博客园博客,原文链接:http://www.cnblogs.com/walkingboy/archive/2006/04/21/380938.html,如需转载请自行联系原作者

目录
相关文章
|
11天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
4天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
17 2
|
13天前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####
|
21天前
|
设计模式 开发者 Python
Python编程中的设计模式:从入门到精通####
【10月更文挑战第14天】 本文旨在为Python开发者提供一个关于设计模式的全面指南,通过深入浅出的方式解析常见的设计模式,帮助读者在实际项目中灵活运用这些模式以提升代码质量和可维护性。文章首先概述了设计模式的基本概念和重要性,接着逐一介绍了几种常用的设计模式,并通过具体的Python代码示例展示了它们的实际应用。无论您是Python初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和实用的技巧。 ####
|
24天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
27 3
|
25天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
27 2
|
27天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
59 3
|
28天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
27 3
|
27天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
28 1
|
28天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
17 2