Proxy模式的疑问,求帮助...
以Proxy模式调整之后,有效实现了职责的分离,DBManager类只关注数据操作逻辑,而不用关心权限判断逻辑,在此仅为Add操作为例来说明:
public class DBManager:IDBAction
{
public void Add()
{
//执行数据增加
}
//部分省略
}
而将权限的判断交给DBManagerProxy代理类来完成,例如:
public class DBManagerProxy:IDBAction
{
private IDBAction dbManager;
public DBManagerProxy(IDBAction dbAction)
{
dbManager=dbAction;
}
//处理权限判断的逻辑
public string GetPermission(string id)
{
//处理权限判断
}
public void Add()
{
if(GetPermission(id)=="CanAdd")
{
dbManager.Add();
}
}
//部分省略
}
通过代理,将数据操作和权限判断两个职责分离,而实际的数据操作由DBManager来执行,此时客户端的调用变得非常简单:
public class DBClient
{
public static void Main()
{
IDBAction DBManager=new DBManagerProxy(new DBManager("CanAdd"));
DBManager.Add();
}
}
疑问: DBManagerProxy类里面不是还是有2个职责吗(2个方法)? 一个是判断权限GetPermission(),一个是Add()添加数据? 为什么说已经把这2职责分离了?
------解决方案--------------------DBManager只管做它的业务(也就是Add),不用操心权限的问题。
这里定义了一个DBManagerProxy来代理DBManager做业务,这个代理的一个很重要功能就是权限判断,在让DBManager做业务前,先判断有没有权限。如果不用这个代理的话,就得在DBManager里增加权限部分,这样对扩展来说就是灾难了,会影响到之前的所有用到DBManager的所有业务。
------解决方案--------------------如何判读一个类只有一个职能,DBManagerProxy类不是做了2件事吗? 一个是权限判断GetPermission(),一个是添加数据Add(),添加数据调用的是DBManager对象去处理。难道调用别的类去处理就不算是自己的职能吗?