1.声明:
(1) 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
(2) 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
2.静态代理模式的弊端:
1. 已经把代理类写死,倒置每个被代理类都需要一个对应代理类,造成代码冗余
package reflection;
interface proceFactrory {
void doJob();
}
public class proceFactroryTest {
public static void main(String[] args) {
proced proced1 = new proced();
proceFactrory proced = new proceFactrory1(proced1);
proced.doJob();
}
}
//代理类
class proceFactrory1 implements proceFactrory {
private proced man;
public proceFactrory1(proced man){
this.man = man;
}
@Override
public void doJob() {
System.out.println("项目开始");
man.doJob();
System.out.println("项目结束");
}
}
// 被代理类
class proced implements proceFactrory {
@Override
public void doJob() {
System.out.println("这个人做的项目很好");
}
}
动态代理
package reflection;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @Description:
* @Author:王工
* @Package:reflection
* @Project:javase
* @name:moveProceFactroryTest
* @Date:2023/3/5 17:05
*/
public class moveProceFactroryTest {
public static void main(String[] args) {
man man = new man();
human northhuman = (human) proce.returnProce(man);
northhuman.eat("喜欢喝羊肉汤");
String name = northhuman.name();
System.out.println(name);
}
}
interface human {
String name();
void eat(String food);
}
class man implements human{
@Override
public String name() {
return "北方人";
}
@Override
public void eat(String food) {
System.out.println(food);
}
}
class proce {
public static Object returnProce(Object obj) {
// 创建实现类的对象,便于作为参数找到对象所属类,进而调用对应的invoke()
myInvocationHandler myInvocationHandler = new myInvocationHandler(obj);
// 根据obj对象确定代理类和代理类的类加载器、实现的接口相同
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),myInvocationHandler);
}
}
class myInvocationHandler implements InvocationHandler {
private Object obj;
public myInvocationHandler(Object obj){
this.obj = obj;
}
// 被代理类需要实现的业务写在invoke方法中
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(obj, args);
return invoke;
}
}