首页 > 新闻系统 > 编程天地 > 文章正文

.Net中的设计模式——Strategy模式

2008-04-14 11:11:08 来源:中国IT实验室 作者: 点击:
Stragety模式的应用极为广泛,在.Net Framework中自然不乏应用的例子。例如在.Net中,为集合类型Array和ArrayList提供的排序功能,其实现中就利用了Strategy模式。它是对比较算法进行了封装,定义了IComparer接口。

nbsp;      public abstract string[] GetRolesForUser(string username);
          public abstract string[] GetUsersInRole(string roleName);
          public abstract bool IsUserInRole(string username, string roleName);
          public abstract void RemoveUsersFromRoles(string[] usernames, string[] roleNames);
          public abstract bool RoleExists(string roleName);

          // Properties
          public abstract string ApplicationName { get; set; }
    }
    在RoleProvider抽象类中,没有具体的实现,均为抽象方法,此时的抽象类其实已与接口无异(注:事实上,在WebLogic中,在对角色管理的API中,就将RoleProvider定义为接口)。为了便于理解这里的设计思想,我们对RoleProvider类进行简化,仅关注该类的CreateRole()抽象方法。
    实现RoleProvider抽象类的类型比较多,例如AuthorizationStoreRoleProvider、SqlRoleProvider、WindowsTokenRoleProvider等等。因此,最后的实现类图应该如下:

st02.gif

子类均重写了父类RoleProvider的抽象方法,例如SqlRoleProvider:   public class SqlRoleProvider:RoleProvider
    {
     public override void CreateRole(string roleName)
     {
      //实现略;
     }
    }
    在ASP.NET中会用到RoleProvider,通常是在web.config配置文件对其进行配置,例如在RoleManager节中配置RoleProvider:
    <roleManager defaultProvider="SqlProvider" enabled="true">
        <providers>
           <add  name="SqlProvider"
            type="System.Web.Security.SqlRoleProvider"
            connectionStringName="SqlServices"
            applicationName="PatternsSample" />
        </providers>
    </roleManager>
    在配置文件中,.Net内部的处理时,要求providers的类型必须是RoleProvider类型,然后通过设置type的值,使其与具体的RoleProvider进行绑定。这里的处置方式显然利用了Dependency Injection(依赖注入)技术,利用反射技术将SqlRoleProvider对象sqlProvider注入,这样就避免了对SqlRoleProvider具体对象的创建,解除了调用者与它之间的偶合。当然在配置文件中,RoleProvider还需与Membership配合使用,但这不是这里所要关注的重点,因此不再详细讲解。
    与RoleProvider相同的设计方式,在.Net Framework中,MemberShipProvider同样利用了Strategy模式,如下图所示的设计结构:

st03.gif

常用的是

9 7 3 1 2 3 4 4 8 :

相关文章:

    无相关新闻
    无相关新闻

精彩推荐
焦点大图推荐
本类热门文章

论坛美图

广告联系 | 版权说明 | 意见建议 | 加入收藏 | 军网站群 [ 军软件园 - 军软件商城 - 军软件园论坛 ]

电信与信息服务业务经营许可证:京ICP证050203