代码改变世界

用Adapter模式重构以前系统的登录权限验证

2009-03-08 21:24  Henry Cui  阅读(2002)  评论(8编辑  收藏  举报

Adapter模式概述

Adapter模式有两种形式,一种是类的形式,一种则是对象的形式。目标就是用Adapter将原本不兼容的几个接口可以一起工作,简单的说,就是将引用的东西转变成我们自己系统需要的接口类型。下面是两种类型Apdapter的图(这两张图都拿自吕老师那里):

Pic58 Pic57

Adapter模式很好的诠释了“依赖倒置”原则,从图中可以看出cilent不是再去依赖Adaptee,而是依赖Target。关于Adapter模式的东西就不再多说了,你看以在这里这里看到吕老师跟TerryLee两位大牛的精彩文章。

重构的源来

我们的系统常常到各个地方去部署,而各个客户商一般都有了自己的权限平台。而客户并不想他们因为有多个系统而需要多次登陆,多次权限分配。所以一般是我们调用他们的webservice去实现用户认证跟权限的获取。而各个地方的权限平台大都是不同的,在以前每次部署一个地方就要改下以前的权限获取跟用户认证部分,这毕竟是让人头疼的事。

用Adapter模式来重构

后来经过几次考虑还是决定用adapter模式来重构下,毕竟欠的帐总是要还的,虽然当初这个帐不是我欠的,但是这个帐已经落到我头上来了,就不能坐着不管了,呵呵。其实我们系统考虑的Target就只是两个东西,一个是用户的认证,一个是权限的获取。考虑当初我们的系统中的用户类CloUser中已经存在了PowerList这样的属性,所以我们需要管的就是我给一个用户名、跟密码返回一个我们一个CloUser就行了,同时考虑到每次个Adapter可能需要实现别人的权限表示到我们权限表示的转换,设计出下面的图:

image

 

我更加喜欢使用类类型的Adapter模式,因为这似乎更加符合“开发封闭原则”。

实现代码

这里给出实习DefaultLoginAdapter(我们自己系统)的代码,毕竟实现其他的也是一样子的。

LoginTarget:

 

 

interface ILoginTarget
   {
        
string ChangeRightFormart(string rightTarget);

        ClOUser CheckUser(
string strUserName, string strUserPsw);
    }

 

DefaultAdapter:

 

 

public class DefaultLoginAdapter : CtlUserRegister, ILoginTarget
    {
        
/// <summary>
        
/// 转换权限表示形式
        
/// </summary>
        
/// <param name="rightTarget"></param>
        
/// <returns></returns>
        public string ChangeRightFormart(string rightTarget)
        {
            
return rightTarget;
        }

        
/// <summary>
        
/// 根据用户名、密码返回一个用户,没有则返回null
        
/// </summary>
        
/// <param name="strUserName"></param>
        
/// <param name="strUserPsw"></param>
        
/// <returns></returns>
        public PDMSLib.Entity.ClOUser CheckUser(string strUserName, string strUserPsw)
        {
            ClOUser user 
= new ClOUser();
            user 
=  this.ReturnUser(strUserName);
            
if (user == nullreturn null;
            
if (!strUserPsw.Equals(user.USER_PWD)) return null;
            
return user;
        }
    }

 

实现其他的Adapter也是一样的,这里的ChangeRightFormart因为是本身,所以不需要转换,直接返回就可以。这样再次到其他地方部署的时候,我们只需要去添加一个Adapter来实现Target就可以了。如果合理的划分程序,也许我们就只要重新更新Adapter的dll就可以,以及修改一些配置就可以轻松实现权限判断,而不需要每次再去看Client里面的逻辑了。这只是我的想法,希望大家能给出更多好的想法。

 

作者:Henllyee Cui
出处: http://henllyee.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。