- 什么是代理模式 ?
- 有几种代理模式,代码实现
- 代理模式 和 装饰模式的区别
part1: 代理模式的概念
代理模式: 不改变源码的情况下,实现对目标对象的功能扩展,对代理的对象施加控制,并不提供对象本身的增强功能(装饰模式为所装饰的对象增强功能,组织结构类似于静态代理, 但‘同途 梳归’, 两个目的不同)
part2: 代码实现(动态代理)
A, 定义接口
interface Person {
void say(String name);
void sleep();
}
interface Work {
void work();
}
B, 定义接口实现类
class P1 implements Person, Work{
@Override
public void say(String name) {
System.out.println("hello "+ name);
}
@Override
public void sleep() {
System.out.println("sleep....");
}
@Override
public void work() {
System.out.println("work.....");
}
}
C, 1-----代理实现类:自定义方法增强类InvocationHandler
public InvocationHandler createHandler() {
//对象: 接口实现类
final P1 p1 = new P1();
// 处理器
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res = null;
//方法增强: 前后控制
if (method.getName().equals("sleep")) {
System.out.println();
System.out.println("----------handler before--- 增强sleep ..");
res = method.invoke(p1, args);
System.out.println("----------handler after---增强sleep ..\n");
} else if (method.getName().equals("say")) {
System.out.println("=========");
Person p = (Person) proxy;
p.sleep();
System.out.println("*********handler before---增强say ..");
res = method.invoke(p1, args);
System.out.println("*********handler after---增强say ..");
System.out.println("=========");
} else {//不增强方法
res = method.invoke(p1, args);
}
return res;
}
};
//返回: 接口实现类
return handler;
}
2------调用Proxy的静态方法: 创建代理对象
@Test
public void newInstance() {
// 代理工具类Proxy :创建对象 ( 接口, 处理器)
Object obj = Proxy.newProxyInstance(
ProTest.class.getClassLoader(),
new Class[]{Person.class, Work.class},
createHandler()
);
Person person = (Person) obj;
person.say("lilsi");
// 代理类: 创建对象
Work worker = (Work) obj;
worker.work();
}
测试结果:动态控制原生对象方法的调用(对原对象--增强say方法, 原生调work方法 )