[浪子学编程][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,如需转载请自行联系原作者

目录
相关文章
|
27天前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
45 4
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
18天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
36 1
|
22天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
26 2
|
27天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
32 4
|
1月前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
28天前
|
设计模式 监控 算法
Python编程中的设计模式应用与实践感悟###
在Python这片广阔的编程疆域中,设计模式如同导航的灯塔,指引着开发者穿越复杂性的迷雾,构建出既高效又易于维护的代码结构。本文基于个人实践经验,深入探讨了几种核心设计模式在Python项目中的应用策略与实现细节,旨在为读者揭示这些模式背后的思想如何转化为提升软件质量的实际力量。通过具体案例分析,展现了设计模式在解决实际问题中的独特魅力,鼓励开发者在日常编码中积极采纳并灵活运用这些宝贵的经验总结。 ###
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
43 2
|
18天前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践感悟####
本文作为一篇技术性文章,旨在深入探讨Python编程中设计模式的应用价值与实践心得。在快速迭代的软件开发领域,设计模式如同导航灯塔,指引开发者构建高效、可维护的软件架构。本文将通过具体案例,展现设计模式如何在实际项目中解决复杂问题,提升代码质量,并分享个人在实践过程中的体会与感悟。 ####
|
1月前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    60
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    47
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    54
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    65
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    43
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    70
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    62
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    43
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    52
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    121