日期:2014-05-20  浏览次数:20658 次

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对象去处理。难道调用别的类去处理就不算是自己的职能吗?