设计模式
代理设计模式
1.静态代理模式
2.动态代理设计模式
代理的作用:
1.功能增强
2.访问控制:通过代理,控制是否可以调用‘目标对象的方法’。
被代理者:目标类,在目标类执行的前后做处理
静态
简介:
1.代理类是手工创建的
2.代理的目标类是确定的
代理类持有被代理类的对象,实现和被代理类相同的接口,并增加相应的业务逻辑,以达到代理的效果。
代码:
interface IService {
public void doService(String name);
}
class Waiter implements IService {
@Override
public void doService(String name) {
System.out.println("当前waiter服务客户:" + name);
}
}
class ProxyWaiter implements IService {
//定义一个目标类对象
private Waiter waiter;
//注入
public void setWaiter(Waiter waiter) {
this.waiter = waiter;
}
@Override
public void doService(String name) {
System.out.println("欢迎光临!");
this.waiter.doService(name);
System.out.println("欢迎下次光临!");
}
}
public class MainTest {
public static void main(String[] args) {
Waiter waiter = new Waiter();
ProxyWaiter proxy = new ProxyWaiter();
proxy.setWaiter(waiter);
proxy.doService("张三");
System.out.println("--------------");
waiter.doService("张三");
}
}
动态:
目标类和代理类之间不是写死的
两种方式
简介:
目标类和代理类之间是动态配置的,动态配置的本质是通过反射机制实现的。
写法一:jdk动态代理实现
invoke 在工程中翻译为“调用”
代码:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface IService {
public void doService(String name);
}
class Waiter implements IService {
@Override
public void doService(String name) {
System.out.println("当前waiter服务客户:" + name);
}
}
class MyInvokeHandler implements InvocationHandler {
private Waiter waiter;
public void setWaiter(Waiter waiter) {
this.waiter = waiter;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("欢迎光临!");
//通过反射调用目标类的方法
method.invoke(waiter,args);
System.out.println("欢迎下次光临!");
return null;
}
}
public class MainTest {
public static void main(String[] args) {
//创建目标类对象
Waiter waiter=new Waiter();
//创建处理类对象
MyInvokeHandler myInvokeHandler = new MyInvokeHandler();
myInvokeHandler.setWaiter(waiter);
//创建代理对象
IService proxy = (IService) Proxy.newProxyInstance(waiter.getClass().getClassLoader(), new Class[]{IService.class}, myInvokeHandler);
proxy.doService("张三");
}
}
写法二:
cglib动态代理
情形:目标类没有接口
简介:
cglib动态代理能够针对没有接口的类,实现动态代理。
代码比jdk动态代理简单
底层会生成目标类的子类,而目标类作为父类
首先导包
asm-3.3.1.jar
cglib-2.2.2.jar
若使用idea,则大可不必
代码:
package com.springboot.demo.hhh;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
class Waiter {
public void doService(String name) {
System.out.println("当前waiter服务客户:" + name);
}
}
class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object target, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
System.out.println("欢迎光临!");
//调用目标类的方法,而目标类是父类
methodProxy.invokeSuper(target, arg);
System.out.println("欢迎下次光临!");
return null;
}
}
public class Test {
public static void main(String[] args) {
//创建目标类对象
Waiter waiter = new Waiter();
//创建方法拦截器对象
MyMethodInterceptor interceptor = new MyMethodInterceptor();
//创建Enhancer对象
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Waiter.class);
enhancer.setCallback(interceptor);
//生成代理类对象
Waiter proxyWaiter = (Waiter) enhancer.create();
proxyWaiter.doService("张三");
}
}



