zoukankan      html  css  js  c++  java
  • 设计模式学习实践策略模式(Strategy Pattern)

          看<<Head First设计模式>>有一段时间了,感觉总是这样看的话收获并不多,由于并没有在实践中应用所以才会比较枯燥,容易看了就忘.并没有实际掌握.就象以前看其它的设计模式的书一样,看了就只是看了,最后回忆起来只是几个模式的大致样子.所以从今天开始打算结合在开发过程中遇到的相应的模式,记录下来,深入理解.
          声明一下:只能保证原创和认真思考.不敢保证质量和水平,但求能够给看的人带来收获.
          策略模式(Strategy Pattern)属于对象行为型模式,体现了两个非常基本的面向对象设计的基本原则:封装变化的概念;编程中使用接口,而不是对接口实现。

    定义:
            定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。每一个算法封装到具有共同接口的独立的类中,策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
    结构:
     
     应用:
      在asp.net的分层的框架开发中,经常需要在某一层使用和另外一个层次相关的东西,这样造成了耦合,对应用程度的扩展性造成了影响.前段时间在开发产品的时候,在业务层经常需要获取或者是保存当前用户信息的操作,这样的操作如果在Controller层的话还好,在业务层就有些头疼.毕竟整个产品框架是想业务层不能局限于WebFrom,存储方式也不能局限于Session,Cookie或者是静态变量.(注:遇到这样的问题,最好是先考虑了是不是设计出了问题).
    NewOrder
    一开始我们用了一个看起来很笨的方法,那就是传递UserID到业务层,但是这也造成了业务层很乱了,因为几乎每个业务方法都需要有个UserID参数...
    NewOrder

          要解决的重点就是要把对用户操作和具体的应用环境解耦,并且又不要对应用程序造成比较大的修改和影响.策略模式的解决方案:(此解决方案源自spring.net)
       
          在IThreadStorage中定义了操作数据的接口(抽象策略对象),会有三个具体的实现CallContextStorage, HybridContextStorage和ThreadStaticStorage(具体策略对象),他们采用不同的方式来实现实现了接口.在LogicalThreadContext(环境对象)中,只引用抽象接口来完成对数据的操作.具体的实现方式对外面是封闭的.我们在开发中在LogicalThreadContext里直接创建了使用的具体策略对象,其实这里可以根据需要做成可配置,或者是利用ioc来实现更灵活些.
         代码实现:

    IThreadStorage.cs
    CallContextStorage.cs


      

    LogicalThreadContext.cs

        这样,我们在Application_BeginRequest方法中记录当前用户,然后在业务层的一个方法里,获取当前用户:

    Application_BeginRequest

        

    BaseManager


        其它的两个实现和类图(及enterprise architect文件),请下载

  • 相关阅读:
    Java Varargs 可变参数使用
    GitLab 如何删除 Forked from
    Git Clone 的时候遇到 Filename too long 错误
    Spring Boot 如何部署到 Linux 中的服务
    Gradle 如何打包 Spring Boot 如何不添加版本代码
    HDU 5878---预处理+二分查找
    HDU 5881--Tea 思维规律
    HDU 5879---cure
    (转)C/S 与 B/S 区别
    卡特兰数
  • 原文地址:https://www.cnblogs.com/lonely7345/p/1315190.html
Copyright © 2011-2022 走看看