`
lianpeng0011
  • 浏览: 9094 次
社区版块
存档分类
最新评论

java代理模式学习

 
阅读更多

      需求

            主人公frade 刚刚来到北京,马上就要开启自己的北漂生活了,首先解决的问题就是需要找房子,那么问题来了,北京的房子如果你想找房东去租,难度太大,比较容易的办法就是找中介。这里咋们用proxy模式来实现下这个需求。

     proxy模式分为两种:静态代理和动态代理,以下是两种方式分别实现上面的需求;

     静态代理

    1. 抽象角色

       按照java面向对象的思路首先定义一个person的接口。

public interface Person {
    /**
     * 这里有两个参数,用来设置目标房源的需求
     * @param roomcount 房间个数
     * @param roomCharge 房租总金额
     */
    void findHouse( int roomcount,int roomCharge );
}

    2. 创建真实角色

 

 

public class Frade implements Person {
    @Override
    public void findHouse( int rommcount , int roomCharge) {
        System.out.println("我最近想找个房子,开启自己的北漂生活");
        System.out.println( "我想找个" + rommcount + "居室" );
        System.out.println("房子租金不超过" + roomCharge + "元");
    }
}

  3.创建中介代理对象,以链家为例

 

 

public class HomeLike implements Person {
    private Person person;
    public HomeLike (Person person){
        this.person = person;
    }
    @Override
    public void findHouse( int roomcount, int roomCharge ) {
        System.out.println("我是链家工作人员小张,现在开始给你找符合你要求的房子");
        System.out.println("我将给你寻找附近符合要求的"+ roomcount +"居室");
        System.out.println("并且一居室的金额不超过"+ roomCharge +"元");
        person.findHouse( roomcount,roomCharge );
        System.out.println("找房子结束");
    }
}

 总结 :

 

      1.抽象主角色,可以是接口,也可以是抽象类;

      2.真实主题角色: 业务逻辑的执行者;

      3.代理主题角色:内部含有真实角色的引用,负责其真实角色的调用,并在真实角色前后做预期的处理和善后的工作。

  静态代理的缺点:

       1.代理对象的一个接口只能服务于一个对象,如果代理的方法很多,势必要每一个方法都进行代理。

       2.如果接口进行扩展,除了实现类实现这个方法外,代理类也需要实现这个方法。

 动态代理:

      本文动态代理还是沿用上面的例子,只对代理类方式进行修改。

      使用JDK 完成动态代理

public class HomeLink implements InvocationHandler{
    private Person person;
    public Person getInstance( Person person ) {
        this.person = person;
        ClassLoader classLoader = person.getClass().getClassLoader();
        return (Person) Proxy.newProxyInstance( classLoader, person.getClass().getInterfaces(), this );
    }
    @Override
    public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable {
        System.out.println("我是链家工作人员小张,现在开始给你找符合你要求的房子");
        for ( int i = 0; i < args.length; i++ ) {
            Object arg = args[i];
            if ( i == 0 ) {
                System.out.println("我将给你寻找附近符合要求的"+ arg +"居室");
            }
            if( i ==1 ){
                System.out.println("并且一居室的金额不超过"+ arg +"元");
            }

        }
        method.invoke( this.person, args );
        System.out.println("找房子结束");
        return null;
    }
}

 动态代理类的实现步骤:

      1.拿到代理对象的引用,并且获取到它所有的接口,利用反射获取;

       2. 用JDK 的 proxy类重新生成一个新的类。同时,类要实现被代理类的所有接口

       3.动态生成java代码,把新添加的业务逻辑方法由一定的逻辑代码去调用(在生成的代码中体现)

       4.重现编译java文件,生产class文件

       5.将生成的class文件加载到JVM中

       6.类实例化

       //以上的这个过程叫做字节码重组。JDK中有一个规范,凡是以$开都的类都是自动生成的。

    cglib 实现动态代理 

       以业务员小张为例子, 小张没次带客户出来看房时,都需要在公司记录看房子的经过,这个记录有专门的人负责进行登记,下面就用cglib来完成这个流程。

      1. 对小张进行抽象

public class XiaoZhang {
    public void findHouse(){
        System.out.println("我是根据客户的条件给客户进行找房子");
    }
}

     2. 完成外出工作记录抽象

public class CglibMeipo implements MethodInterceptor{
    public Object getInstance(Class<?> clazz) throws  Exception{
        Enhancer enhancer = new Enhancer();
        //要把哪个设置为即将生成的新类父类
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return  enhancer.create();
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //对业务员看房记录做登记
        System.out.println("记录外出日期,所带客户资料");
        System.out.println("客户看房需求");
        methodProxy.invokeSuper(o,objects);
        System.out.println("看房结束,会去进行报道");
        return null;
    }
}

    3.测试

public class CglibTest {
    public static void main(String[] args) {
        try {
            XiaoZhang obj = (XiaoZhang )new CglibMeipo().getInstance(XiaoZhang .class);
            obj.findLove();
            System.out.println("--------------------------------");
           // System.out.println(obj.getClass());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

   cglib 和jdk 动态代理的区别 ,jdk动态代理在生成类时,用户必须实现接口,如果没有实现接口,无法动态生成,cglib完美的解决了这个痛点,当用户不能继承接口时,可以用cglib进行动态生成。

       

 

 

            

分享到:
评论

相关推荐

    Java设计模式-代理模式例子

    通过学习和实践代理模式,开发者可以更好地理解和掌握面向对象设计原则,如单一职责原则和开闭原则,同时也能提高代码的复用性和可测试性。在Java世界里,设计模式是连接理论和实践的重要桥梁,是每个专业开发者必备...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    java设计模式学习

    本资料“java设计模式学习”包含了对设计模式的深入理解和实际应用,通过简单实用的例子,帮助开发者掌握如何在Java项目中运用设计模式。 首先,我们要介绍的是工厂模式。工厂模式是一种创建型设计模式,它提供了一...

    java中的三种代理模式

    在Java编程中,代理模式是一种常用的面向对象设计模式,它允许我们为一个对象提供一个代理以控制...通过学习和实践这些例子,你可以深入理解这三种代理模式的实现细节和应用场景,从而更好地在实际项目中应用代理模式。

    java设计模式视频教程-代理模式.rar

    在这个“java设计模式视频教程-代理模式.rar”压缩包中,包含了一部关于代理模式的视频教程,以及相关的课件和示例代码。 代理模式的核心思想是通过代理类来代理原始对象,为原始对象提供一个替代品或占位符,以...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    java设计模式ppt

    代理模式主要用于添加额外的功能,如权限检查、性能优化等,而不会影响原始对象的实现。 #### 7. 原型模式 (Prototype Pattern) 原型模式是一种创建型模式,通过复制现有的实例来创建新的对象。这种方法避免了构造...

    java代理模式示例源码

    在给定的“java代理模式示例源码”中,我们可以通过房产中介的例子来理解这种模式。 房产中介在现实生活中,是客户与房东之间的桥梁,它可以代表客户处理租赁事宜,也可以在房东和客户之间传递信息,这与代理模式的...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    3. **代理模式**:代理模式为其他对象提供一种代理以控制对这个对象的访问。它可以用来在访问目标对象前添加额外的功能,如权限检查、日志记录或者缓存策略。Java中,静态代理和动态代理(Java Proxy API)是常见的...

    Java设计模式-代理模式

    Java设计模式是软件开发中的重要概念,它是一种在软件系统中重用代码、提高灵活性和可维护性的方法。代理模式是这些设计模式中的一种,它为其他...通过学习和应用代理模式,开发者可以更好地设计和实现复杂的软件系统。

    16-Java代理模式的学习笔记1

    Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在调用原始对象的方法之前或之后执行额外的操作。代理模式在软件工程中有多种应用,例如:增加安全控制、性能监控、事务管理等。...

    Java 代理模式

    Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理对象,该代理对象在调用实际对象的方法之前或之后可以执行额外的操作。这在不修改原有对象代码的情况下,提供了扩展功能的可能性。代理模式通常分为两...

    JAVA设计模式例程-代理模式

    在这个"JAVA设计模式例程-代理模式"的压缩包中,我们可以深入学习如何在Java中实现这一模式。 1. **代理模式的基本概念** 代理模式的核心思想是为一个目标对象创建一个代理对象,代理对象在客户端和目标对象之间起...

    代理模式java代码 Proxy(1)

    至于`中国java下载站.url`,这可能是一个链接到Java学习资源的网址,它并非代理模式的一部分,但强调了学习Java的重要性,尤其是对于理解和实践设计模式,如代理模式,这些资源可以帮助开发者扩展知识面,提升技能。...

    Java 经典设计模式讲解以及项目实战

    8 代理模式 9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 门面+模版方法+责任链+策略+工厂方法 3 动态代理+Spring AOP 4 责任链模式进阶 Spring Framework...

    JAVA设计模式(java设计)

    - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 - 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 3. 行为型模式: - 责任链模式:使多个对象有机会处理请求,从而避免请求...

    Java代理学习

    Java代理的学习涵盖了面向接口编程、设计模式、反射等核心概念。静态代理适用于简单场景,代码可读性好,但维护成本高;动态代理则更灵活,适用于需要频繁创建不同代理对象的场景。通过深入理解这两种代理方式,...

    Java与模式(闫宏)

    2. 结构型模式:适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式。这些模式主要处理类和对象之间的关系,提高代码的可扩展性和模块化。 3. 行为型模式:策略模式、模板方法模式、观察者...

    java与模式光盘源码

    在Java与模式的光盘源码中,你可以找到这些模式的实际应用示例,这对于学习和掌握设计模式至关重要。例如,单例模式的实现通常通过私有构造函数、静态内部类或枚举等方式,确保类只有一个实例。工厂方法模式则通过...

Global site tag (gtag.js) - Google Analytics