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


    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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
  • 相关阅读:
    mysql 约束条件介绍
    mysql 约束条件目录
    mysql 日期类型
    mysql float 浮点型
    mysql int 整数类型 解释显示宽度 和 存储宽度
    mysql 整数类型 数值类型 tinyint
    【洛谷P4096】Eden 的博弈树
    【GMOJ6824】英雄联盟
    【GMOJ6826】隔膜
    【POJ 2420】A Star not a Tree?
  • 原文地址:https://www.cnblogs.com/Henllyee/p/1406477.html
Copyright © 2020-2023  润新知