java 中的代理

来源:互联网 发布:易语言仓库管理源码 编辑:程序博客网 时间:2024/05/21 17:58

java中的代理分为两种,

1,静态代理

2,动态代理

其中的动态代理,是程序在运行过程中会产生新的类,

而静态代理是在编译是就能知道被代理者的真实类型

静态代理的例子如下:

package com.test.proxy;
//静态代理
public class StateProxy {

}
//定义一个接口类型
interface Shop{
void saleWater();//卖水
void saleFood();//买小吃,食物
}
//
class RealCustormer implements Shop
{


@Override
public void saleWater() {
// TODO Auto-generated method stub
System.out.println("successFul Water");
}


@Override
public void saleFood() {
// TODO Auto-generated method stub
System.out.println("successFul Food");


}

}
//定义快递员(代理)
class ProxyKd implements Shop{
private RealCustormer[] RealCustormer =null;
private int index=0;
public ProxyKd(int index)
{
if(index<0||index>4)
{
index=0;
}
this.index = index;
}

public ProxyKd()
{

for(int i=0;i<5;i++)
{
RealCustormer[i] = new RealCustormer();
}
}



public void saleWater1() {
// TODO Auto-generated method stub
RealCustormer[index].saleWater();
}
@Override
public void saleFood() {
// TODO Auto-generated method stub
//不暴露接口 
}
public static void main(String[] args) {
Shop shop  = new ProxyKd(3);
shop.saleWater();//只暴露一个买水的方法

}




@Override
public void saleWater() {
saleWater1();

}

}

//动态代理如下



package com.test.proxy;
/**
 * 动态代理
 */
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Maintest{

public static void main(String[] args) {
Subject sub  = new SubjectImpl();
Proxy1 pr = new Proxy1(sub);
Subject s = (Subject)pr.getProxy();
s.add();

}


}
class Proxy1 implements InvocationHandler{
private Object subject;
public Proxy1(Subject target)
{
this.subject = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("调用之前");
Object object = method.invoke(subject, args);
System.out.println("调用之后");


return object;
}
public Object getProxy(){
ClassLoader loader = Thread.currentThread().getContextClassLoader();//类加载器(当前线程的类加载器)
Class<?>[] interfaces = subject.getClass().getInterfaces();//实现接口的class对象引用
return java.lang.reflect.Proxy.newProxyInstance(Proxy1.class.getClassLoader(),new Class[]{Subject.class} , this);
}

}
interface Subject{
void add();
}
class SubjectImpl implements Subject{


@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("add");
}

}


以下来自转载:


.代理模式使用原因和应用方面

(1)授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问论坛有两种人:注册用户和游客(未注册用户),Jive中就通过类似ForumProxy这样的代理来控制这两种用户对论坛的访问权限.

(2)某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动.
     举例两个具体情况: 
     如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这时需要做个图片Proxy来代替真正的图片.
     
     如果那个对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象.
     
     总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝贵的Java内存. 所以,有些人认为Java耗费资源内存,我以为这和程序编制思路也有一定的关系.

(3)现实中,Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用

原创粉丝点击