06.代理模式

1.什么是代理设计模式

在目标方法之前或之后实现增强

2.代理模式角色

被代理类

代理类

抽象主体角色

3.代理模式实现方式

实现方式 
静态代理:人为创建好代理类继承
实现
动态代理:通过反射或者字节码自动创建代理类JDK动态代理
CGLIB动态代理

4.静态代理-继承方式

链接:https://pan.baidu.com/s/17qOg4S8qVxBx2i5m4ARHsw 
提取码:37pr

1)定义共同的抽象方法 

public interface OrderService {

    /**
     * 共同抽象的方法
     */
    void order();
}

2)定义实现类

import com.demo.service.OrderService;

public class OrderServiceImpl implements OrderService {

    public void order() {
        System.out.println("执行订单业务逻辑代码");
    }
}

3)代理类

import com.demo.service.impl.OrderServiceImpl;

public class OrderServiceProxy extends OrderServiceImpl {

    public void order() {
        System.out.println(">>>打印订单日志开始");
        super.order();
        System.out.println(">>>打印订单日志结束");
    }

}

 4)测试

public class Test {

    public static void main(String[] args) {
        OrderServiceProxy orderServiceProxy = new OrderServiceProxy();
        orderServiceProxy.order();
    }
}

5.静态代理-实现方式

链接:https://pan.baidu.com/s/1JAvv48CZHJT0hWg4z3VAHw 
提取码:i8n2

1)共同的抽象类 

public interface OrderService {

    /**
     * 共同抽象的方法
     */
    void order();
}

2)实现类 

import com.demo.service.OrderService;

public class OrderServiceImpl implements OrderService {

    public void order() {
        System.out.println("执行订单业务逻辑代码");
    }
}

3)代理类 

import com.demo.service.OrderService;

public class OrderServiceProxy implements OrderService {

    private OrderService orderService;

    public OrderServiceProxy(OrderService orderService) {
        this.orderService = orderService;
    }

    public void order() {
        System.out.println(">>>打印订单日志开始");
        orderService.order();
        System.out.println(">>>打印订单日志结束");
    }

}

4)测试类 

import com.demo.proxy.OrderServiceProxy;
import com.demo.service.impl.OrderServiceImpl;

public class Test {

    public static void main(String[] args) {
        OrderServiceProxy orderServiceProxy = new OrderServiceProxy(new OrderServiceImpl());
        orderServiceProxy.order();
    }
}

6.动态代理-JDK动态代理

链接:https://pan.baidu.com/s/1xf95nCmHnaYc5fdYkqxSfw 
提取码:flwm 

1)共同的抽象方法 

public interface OrderService {

    /**
     * 共同抽象的方法
     */
    void order();
}

2)实现类 

import com.demo.server.OrderService;

public class OrderServiceImpl implements OrderService {

    public void order() {
        System.out.println("执行订单业务逻辑代码");
    }
}

3)代理类 

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

public class JdkInvocationHandler implements InvocationHandler {

    /**
     * 被代理类对象 目标代理对象
     */
    private Object target;

    public JdkInvocationHandler(Object target) {
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(">>>jdk打印订单日志开始:proxy:" + proxy.getClass().toString());
        Object reuslt = method.invoke(target, args);// java的反射机制执行方法 执行目标对象的方法
        System.out.println(">>>jdk打印订单日志结束");
        return reuslt;
    }

    /**
     * 使用jdk动态代理创建代理类
     * @param <T>
     * @return
     */
    public <T> T getProxy() {
        return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
}

4)测试类 

import com.demo.proxy.JdkInvocationHandler;
import com.demo.server.OrderService;
import com.demo.server.impl.OrderServiceImpl;

public class Test {

    public static void main(String[] args) {
        OrderService proxy = new JdkInvocationHandler(new OrderServiceImpl()).getProxy();
        proxy.order();
    }
}

7.动态代理-CGLIB动态代理

链接:https://pan.baidu.com/s/1cN7lfQgdYJJMpG19XenRaw 
提取码:gge3

 1)pom依赖

    <dependencies>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.12</version>
        </dependency>
    </dependencies>

2)共同的抽象类

public interface OrderService {

    /**
     * 共同抽象的方法
     */
    void order();
}

3)实现类

import com.demo.server.OrderService;

public class OrderServiceImpl implements OrderService {

    public void order() {
        System.out.println("执行订单业务逻辑代码");
    }
}

4)代理类

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibMethodInterceptor implements MethodInterceptor {

    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println(">>>>cglib日志收集开始....");
        Object reuslt = proxy.invokeSuper(obj, args);
        System.out.println(">>>>cglib日志收集结束....");
        return reuslt;
    }
}

5)测试类

import com.demo.proxy.CglibMethodInterceptor;
import com.demo.server.impl.OrderServiceImpl;
import net.sf.cglib.proxy.Enhancer;

public class Test {

    public static void main(String[] args) {
        CglibMethodInterceptor cglibMethodInterceptor = new CglibMethodInterceptor();
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(OrderServiceImpl.class);
        enhancer.setCallback(cglibMethodInterceptor);
        OrderServiceImpl orderServiceImpl = (OrderServiceImpl)enhancer.create();
        orderServiceImpl.order();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值