代理模式(Proxy Pattern)

23种设计模式系列目录

23种设计模式之单例模式(Singleton Pattern)

23种设计模式之代理模式(Proxy Pattern)

23种设计模式之适配器模式(Adapter Pattern)

23种设计模式之工厂模式(Factory Pattern)

23种设计模式之抽象工厂模式(Abstract Factory Pattern)

23种设计模式之装饰器模式(Decorator Pattern)

--------------------------------------------------------------------------------------------------------------------------

读完本篇文章将会了解以下问题

1. 代理模式定义

2. Java代理模式的三种实现方式

3. 三种代理模式实现方式的优缺点分析

--------------------------------------------------------------------------------------------------------------------------

1. 代理模式定义

        代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

2. Java代理模式的三种实现方式

Java代理模式据我所知有4种实现方式(基于Aspectj的动态代理还不了解,先列在这,以后补上):

        1、静态代理,工程师编辑代理类代码,实现代理模式;在编译期就生成了代理类。

        2、基于JDK实现动态代理,通过JDK提供的工具方法Proxy.newProxyInstance动态构建全新的代理类(继承Proxy类,并持有InvocationHandler接口引用 )字节码文件并实例化对象返回。

        3、基于CGlib动态代理是基于继承被代理类生成代理子类,被代理类必须是非final 类,方法也必须是非final修饰。

        4、基于Aspectj实现动态代理(修改目标类的字节,织入代理的字节,在程序编译的时候插入动态代理的字节码,不会生成全新的Class)

静态代理:

类图关系

   Star接口

package user;
public interface Star {
    String sing();
}

  Giao哥实体

package user;
public class BrotherGiao implements Star {
    @Override
    public String sing() {
        System.out.println("Giao哥:一给我里giaogiao");
        return "giao哥唱完了" ;
    }
}

  代理类Agent 

package user;
public class Agent implements Star {
    private  BrotherGiao brotherGiao;
    public Agent(BrotherGiao brotherGiao){
        this.brotherGiao = brotherGiao;
    }
    @Override
    public String sing() {
        brotherGiao.sing();
        return null;
    }
}

 main方法

public class run001 {
    public static void main(String[] args) {
        Agent agent = new Agent(new BrotherGiao());
        agent.sing();
    }
}

基于jdk的动态代理可以看我这篇文章:用通俗易懂的语言去解释JDK的动态代理

 

基于cglib的动态代理可以看我这篇文章:用通俗易懂的语言去解释cglib的动态代理

基于 Aspectj 实现的动态代理源码还没看,以后会补上的。

3. 三种代理模式实现方式的优缺点分析

静态代理优点:

       1、静态代理对客户隐藏了被代理类接口的具体实现类,在一定程度上实现了解耦合,同时提高了安全性,这是代理模式的共有优点。

静态代理缺点:

       1、代理对象的一个接口只服务于一种类型的对象,如果要代理的类型增多,势必要为每一种类型的方法都进行代理,造成了代码灵活性不强。

       2、如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法,造成了代码的大量冗余。

JDK动态代理优点:

       1、Java自身支持,不需要外部依赖,且随着版本稳定升级

       2、编码简单

JDK动态代理缺点:

       1、只能基于接口进行代理,不能对类进行代理(因为已经继承了Proxy,java不支持多继承)。在创建代理类时,需要传入被代理类所实现的接口作为参数。如果被代理类没有实现接口而直接定义了业务方法,就无法使用JDK动态代理了。

       2、如果被代理类中新增了接口中没有的方法,这些方法是无法被代理的。

cglib动态代理优点:

       1、可以传入接口也可以传入普通的类,接口使用实现的方式,普通类使用会使用继承的方式生成代理类

       2、实现方法访问优化,通过建立方法索引的方式避免了传统JDK动态代理需要通过Method方法反射调用

       3、提供callback和filter设计,可以灵活地给不同的方法绑定不同的callback,编码更方便灵活

       4、默认代理Object中equals,toString,hashCode,clone等方法,比JDK代理多了clone方法

cglib动态代理缺点:

       1、由于是继承方式,如果是 static方法,private方法,final方法等描述的方法无法被代理

       2、由于创建了三个class对象,所以创建代理对象的代价相对jdk动态代理较高

Aspectj源码还没看,不了解。。。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值