面朝大海,春暖花开

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  12 Posts :: 1 Stories :: 3 Comments :: 0 Trackbacks

近来很忙,一直没写 blog 了,今天晚上有点时间,听了节 MSDN 上面的一节 webCast ,讲的就是 Proxy 模式,本就就是这节课的笔记。

学习设计模式也有段时间了,很早也见过 Proxy 模式的,记得最开始接触 Proxy 模式还是在著名的 JIVE 论坛( JIVE 中用 Proxy 来做权限控制)。今天算是一遍复习吧。

对复杂的软件系统,人们常常用的一种处理手法是在系统增加一层间接层,得到对系统灵活的、满足特殊要求的解决方案。

使用 Proxy 模式的动机:在 OO 的开发过程中,某些对象的开销很大(如: new 的开销大、某些对象因为安全的原因不能被客户直接的调用等),如果直接操作这些对象会破坏系统结构。那么,我们就用代理对象来控制对象的访问。

例子,   一个常见的 HR 系统:

using  System;

class  Employee
{
    
public   double  GetSalary()
    
{
        ..
    }

    
public   void  Report()
    
{
        .
    }

    
public   void  ApplyVacation()
    
{
        
    }

}


class  HrSys
{
    
public   void  ProcessEmployee
        (Employee employee
/* 该对象和HR系统在同一个地址空间中 */ )
    
{
        employee.Report();
        ..
        employee.ApplyVacation();
    }

}

现在要求把 Employee 做成 webService HR 系统通过 webService 来调用 Employee 对象,代码修改如下:

using  System;

interface  IEmployee
{
    
public   double  GetSalary();
    
public   void  Report();
    
public   void  ApplyVacation();
}

// 运行在internet上面的某台机器
class  Employee : IEmployee
{
    
public   double  GetSalary()
    
{
        ..
    }

    
public   void  Report()
    
{
        .
    }

    
public   void  ApplyVacation()
    
{
        
    }

}

// 运行在本地的程序中
class  EmployeeProxy : IEmployee
{
    
public   double  GetSalary()
    
{
        
// 对对象创建/访问的SOAP封装
    
     
// 发送SOAP数据
    
     
// 如果有返回值,就对SOAP分析,得到C#数据
    }

    
    
public   void  Report()
    
{
        
// 对对象创建/访问的SOAP封装
    
     
// 发送SOAP数据
    
     
// 如果有返回值,就对SOAP分析,得到C#数据
    }

    
    
public   void  ApplyVacation()
    
{
        
// 对对象创建/访问的SOAP封装
    
     
// 发送SOAP数据
    
     
// 如果有返回值,就对SOAP分析,得到C#数据
    }

}

class  HrSys
{
    
public   void  ProcessEmployee(IEmployee employeeProxy)
    
{
        employeeProxy.Report();
        ..
        employeeProxy.ApplyVacation();
    }

}

Proxy 使用的要点:

1 、“增加一层间接层”,是软件系统中常用的手段之一。

2 、具体的实现中, Proxy 有很大差别,有的是简单的“ copy-on-write ”,有的是对组件模块的抽象代理。在 JAVA 中常见的 SSH 架构模式中( struts+spring+hibernate )中,我们可以把 spring 所在的服务层看成对 hiberate 的代理。

具体的实现可以参考 .NET 中的 WebService 的实现。

Copy-on-write 技术

class  App
{
    
// 系统在内存中其实是指向同一块内存
     string  s1  =   " Hello " // 不可在修改
     string  s2  =   " Hello " // 不可在修改

    
// s1.ToUpper();  // s1不会产生任何改变

    stringBulider sb1 
=   new  stringBulider( " Hello " );
    stringBulider sb2 
=   new  stringBulider( " Hello " );
    
    sb1.replace(
" H " , " L " );  // 可以修改成功
}

sb1.replace("H","L"); 系统做的动作是, sb1 的代理对象先拷贝 ”Hello” 字符串,然后用“ L ”替换“ H ”, sb1 的代理对象重新指向新的对象。

posted on 2006-04-27 20:33 面朝大海 阅读(296) 评论(0)  编辑  收藏 所属分类: 软件工程

只有注册用户登录后才能发表评论。


网站导航: