Adapter模式概述
Adapter模式有两种形式,一种是类的形式,一种则是对象的形式。目标就是用Adapter将原本不兼容的几个接口可以一起工作,简单的说,就是将引用的东西转变成我们自己系统需要的接口类型。下面是两种类型Apdapter的图(这两张图都拿自吕老师那里):
Adapter模式很好的诠释了“依赖倒置”原则,从图中可以看出cilent不是再去依赖Adaptee,而是依赖Target。关于Adapter模式的东西就不再多说了,你看以在这里和这里看到吕老师跟TerryLee两位大牛的精彩文章。
重构的源来
我们的系统常常到各个地方去部署,而各个客户商一般都有了自己的权限平台。而客户并不想他们因为有多个系统而需要多次登陆,多次权限分配。所以一般是我们调用他们的webservice去实现用户认证跟权限的获取。而各个地方的权限平台大都是不同的,在以前每次部署一个地方就要改下以前的权限获取跟用户认证部分,这毕竟是让人头疼的事。
用Adapter模式来重构
后来经过几次考虑还是决定用adapter模式来重构下,毕竟欠的帐总是要还的,虽然当初这个帐不是我欠的,但是这个帐已经落到我头上来了,就不能坐着不管了,呵呵。其实我们系统考虑的Target就只是两个东西,一个是用户的认证,一个是权限的获取。考虑当初我们的系统中的用户类CloUser中已经存在了PowerList这样的属性,所以我们需要管的就是我给一个用户名、跟密码返回一个我们一个CloUser就行了,同时考虑到每次个Adapter可能需要实现别人的权限表示到我们权限表示的转换,设计出下面的图:
我更加喜欢使用类类型的Adapter模式,因为这似乎更加符合“开发封闭原则”。
实现代码
这里给出实习DefaultLoginAdapter(我们自己系统)的代码,毕竟实现其他的也是一样子的。
LoginTarget:
{
string ChangeRightFormart(string rightTarget);
ClOUser CheckUser(string strUserName, string strUserPsw);
}
DefaultAdapter:
{
/// <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 == null) return null;
if (!strUserPsw.Equals(user.USER_PWD)) return null;
return user;
}
}
实现其他的Adapter也是一样的,这里的ChangeRightFormart因为是本身,所以不需要转换,直接返回就可以。这样再次到其他地方部署的时候,我们只需要去添加一个Adapter来实现Target就可以了。如果合理的划分程序,也许我们就只要重新更新Adapter的dll就可以,以及修改一些配置就可以轻松实现权限判断,而不需要每次再去看Client里面的逻辑了。这只是我的想法,希望大家能给出更多好的想法。