代理

1为什么需要代理?

答:有重复代码,可以利用代理实现,简化代码。

静态代理代码示例:

package daili;

//接口Subject
interface Subject {
public void out(); 
public void in();
}

//Subject实现类 真实类
class realsubject implements Subject{
public void out() { 
System.out.println("出去吃饭"); }
public void in() {
System.out.println("吃饭回来");}
}
class proxysubject{ //代理类
private Subject subject;
public proxysubject(Subject subject) {
super();
this.subject = subject;
}
public void invoke(String flag) {//执行真实类的方法(辅助方法和调用真实类的方法)
System.out.println("开门");
if("out".equals(flag)) {
this.subject.out();
}
else if("in".equals(flag)) {
this.subject.in();
}
System.out.println("关门");
}

}
public class test{
public static void main(String[] args) {
proxysubject tt=new proxysubject(new realsubject());//使用代理类
tt.invoke("in");
}}

//该示例 包括一个接口,一个 接口的实现类,一个代理类(包含一个构造方法用来创建接口的实现对象,包含一个代理方法(包括辅助方法和调用实现类的方法))

2静态代理缺点。

答:静态代理高度依赖主题类,耦合性高,由此引入动态代理。

一个动态代理示例:

package daili0;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//接口

interface Subject{
public void out();
public void in();
}

//接口的实现类
class RealSubject implements Subject{
public void out() {
System.out.println("出去吃饭");
}
public void in() {
System.out.println("吃饭回来");
}}

//动态代理类 实现invocationHandler
class SubjectProxy implements InvocationHandler{
private Object obj;
public SubjectProxy() {

}
public SubjectProxy(Object obj) {

    this.obj=obj;

}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("打开门");//辅助方法
Object result=method.invoke(obj, args);//反射调用真实主题类的方法
System.out.println("关门");//辅助方法
return result;

}

}
public class test01{
public static void main(String[] args) {
Subject subject=new RealSubject();
InvocationHandler handler=new SubjectProxy(subject);
Subject pSubject=(Subject)Proxy.newProxyInstance(handler.getClass().getClassLoader(),
subject.getClass().getInterfaces(), handler);
pSubject.out();
System.out.println("293939");
}
}//动态代理的好处消除了静态代理耦和性高这一缺点

posted @ 2019-04-18 13:47  zhengzhan19  阅读(67)  评论(0编辑  收藏  举报