栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

结合JDK,Spring,Mybatis,Netty,Tomcat,Dubbo等经典框架的源码对设计模式展开分析(五)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

结合JDK,Spring,Mybatis,Netty,Tomcat,Dubbo等经典框架的源码对设计模式展开分析(五)

结构型设计模式

  • 代理模式(Proxy Pattern)

定义:为其他对象提供一种代理,以控制这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用

应用目的:保护目标对象,动态增强目标对象,代理模式分为静态代理和动态代理

角色:抽象目标角色,目标角色,代理角色

代理对象通过实现和目标对象所实现的接口,然后在实现类中,持有目标对象,于是在代理类中对抽象方法实现,并在调用目标对象的行为的基础上,增加自己的行为增强

通用静态代理方式实现:

抽象目标角色

package com.ProxyPattern;


public interface Isubject {
    void request();
    void doSomthing();
}

目标角色

package com.ProxyPattern;


public class RealSubject implements Isubject {
    @Override
    public void request() {
        System.out.println("真实角色的自带行为");

    }

    @Override
    public void doSomthing() {
        System.out.println("真实角色自带的另一个行为");
    }
}

代理类和测试

package com.ProxyPattern;


public class ProxySubject implements Isubject {
    private Isubject real;
    @Override
    public void request() {
        before();
        real.request();
        after();
    }

    @Override
    public void doSomthing() {
        System.out.println("啥玩意儿");
    }

    private void after() {
        System.out.println("在目标行为运行前代理织入行为增强");
    }

    private void before() {
        System.out.println("在目标行为运行后代理织入行为增强");
    }



    public ProxySubject(Isubject real){
        this.real=real;
    }

    public static void main(String[] args) {
        new ProxySubject(new RealSubject()).request();
    }

}

JDK中有内置的Proxy类(java.lang.reflect)做动态代理从原理上看是对对象的的代理

使用上主要有InvocationHandler,Method,Proxy三个类和接口

Proxy的newProxyInstance()方法返回代理类,需要提供三个参数:目标对象的类加载器,目标对象类所实现的接口,InvocationHandler接口的实例

InvocationHandler接口定义了invoke()方法,入参:目标实例,目标对象的方法(Method类型 ),参数Object数组,需要用户去是实现,invoke()方法是对目标对象所有方法的增强逻辑  我的理解,Proxy.newProxyInstance()通过入参用户实现的InvocationHandler对象中的Invoke()方法,来构造代理对象所代理的目标对象的方法的代理方法,在Invoke()方法里面,可以通过入参的methon,用method.invoke调用目标对象的方法,也可以不调用,完全去“覆盖”目标对象的方法。在定义InvocationHandler的实现时,经常习惯性的把获取代理类的方法封装在其中,然后在使用时直接调用即可

package com.ProxyPattern;

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


public class JDKproxy implements InvocationHandler {
    private Isubject target;
    public Isubject getInstance(Isubject target){
        this.target=target;
        Class aClass = target.getClass();
       return (Isubject) Proxy.newProxyInstance(aClass.getClassLoader(),aClass.getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(this.target, args);
        after();
        return result;
    }

    private void after() {
        System.out.println("在目标行为运行前代理织入行为增强");
    }

    private void before() {
        System.out.println("在目标行为运行后代理织入行为增强");
    }

    public static void main(String[] args) {
        Isubject proxy = new JDKproxy().getInstance(new RealSubject());
        proxy.request();
        proxy.doSomthing();

    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/868458.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号