---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
代理模式
注:真是觉得和代理角色必须实现同一个借口。
3.总结
代理模式的使用场合:
1.远程代理(Remote Proxy):为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。在.NET中,调用远程的
WEB Service或者远程对象都用到了远程代理。对于WEB Service,我们都不陌生,当我们在项目中添加一个WEB引用,引用一个webService,此时会在项目中生成一个WebReference的文件夹和一下文件,其实,他们就是代理,这就使得客户端程序调用代理就可以解决远程访问的问题。
2.虚拟代理(Virturl Proxy):根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。使用虚拟代理,有时可以是程序性能达到最优化,例如,我们打开一个html网页时,里面有很多文字和图片,你可以很快的打开,但你看到是只是文字,而图片却是一张张下载完后你才能看到,那些未打开的图片框,就是通过虚拟代理来替代真实的图片,此时代理存储了真实图片的路径和尺寸。
3.保护代理(Protection Proxy):控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。
4.智能指引(Smart Reference):取代了简单的指针,并在访问对象时执行一些附加操作。
5.Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
6.Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
7.防火墙(Firewall)代理:保护目标,不让恶意用户接近。
8.同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
实现要点:
1.代理对象和被代理对象都遵循一致的接口。
2.在某些情况下,可以不必保持接口一致性,如果封装确实需要损失一些透明度,那么也可以认为是Proxy。
--摘自http://www.cnblogs.com/peida/archive/2008/08/18/1268991.html
静态代理:这里以租房为例,
中介就是代理,客户找好房,需要给中介费和押金才能入住
租期满后,中介要退还押金并收拾房间等待下次出租
package com.proxy;
//客户端
public class ProxyTest2
{
public static void main(String[] args)
{
ProxySubject proxy1 = new ProxySubject();
proxy1.doSomething();
}
}
//公共接口
interface Subject
{
public void doSomething();
}
//真是对象
class RealSubject implements Subject
{
public RealSubject(){}
public void doSomething()
{
System.out.println("realSubject is doing.");
}
}
//代理对象
class ProxySubject implements Subject
{
private RealSubject realSubject;
public void doSomething()
{
//在这里,客户端访问真实对象的时候,代理对象可以在这里添加一些准备操作(客户找房子需要收中介收中介费和押金)
preDo();
if(realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.doSomething();
//在这里,客户端访问完真实对象,代理对象可以在这里添加一些善后操作(客户租期满后中介退还押金并请物业收拾房子)
afterDo();
}
public void preDo()
{
System.out.println("preDo");
}
public void afterDo()
{
System.out.println("afterDo");
}
}
动态代理:
动态代理使用的代理是有java API提供的借口来创建代理,代理必须要实现InvocationHandle 接口并实现invok方法
package com.proxy;
//公共接口
public interface Subject2
{
public void output();
public String output2(String string);
}
package com.proxy;
//真是角色
public class RealSubject2 implements Subject2
{
@Override
public void output()
{
System.out.println("realsubject's output");
}
@Override
public String output2( String string)
{
System.out.println("realsubject's output2");
return "outPut2";
}
}
package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxySubject2 implements InvocationHandler
{
private Object sub;
public ProxySubject2(Object sub)
{
this.sub = sub;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
// TODO Auto-generated method stub
preDo();
method.invoke(sub, args);
afterDo();
return null;
}
public void preDo()
{
System.out.println("preDo");
}
public void afterDo()
{
System.out.println("afterDo");
}
}
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------