静态代理
public class Daili implements Animal{
private Animal animal=new Dog();
@Override
public void eat() {
System.out.println("增强set方法开始");
animal.eat();
System.out.println("增强set方法结束");
}
@Override
public void bark() {
System.out.println("增强bark方法开始");
animal.bark();
System.out.println("增强bark方法结束");
}
}
//装饰模式对构造方法传入的对象进行增强
//代理模式隐藏里真实的对象,用户无需关心真实对象
动态代理
实现方式:两种使用java提供的类和CGLIB
实现方式一:使用Proxy类实现
public class TestProxy {
public static void main(String[] args) {
Dog dog=new Dog();
//创建代理对象
//第一个参数式真实对象对应类的类加载器
//第二个参数表示真实对象实现了那些接口
Animal animal=(Animal)
Proxy.newProxyInstance(dog.getClass()
.getClassLoader(), dog.getClass().getInterfaces(), new InvocationHandler() {
@Override
//第一个参数代理对象,第二个参数方法对象,第三个参数方法参数对象
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("eat".equals(method.getName())) {
System.out.println("增强eat方法开始");
dog.eat();
System.out.println("增强eat方法结束");
}else if ("bark".equals(method.getName())){
System.out.println("增强bark方法开始");
dog.bark();
System.out.println("增强bark方法结束");
}
return null;
}
});
animal.eat();
animal.bark();
}
}