Java设计模式三 ------ 动态代理模式

上一篇博客大致说了一下静态代理相关的一些知识点和用法。我们不难看出静态代理的优缺点。

静态代理的优点:业务类只需要关注业务本身,保证了代码的重用性。 

静态代理的缺点:一个真实角色只能对应一个代理角色,要是真实角色多了,代理也随着增多,会导致类的急剧膨胀。

好吧,既然你已经发现她的缺点了,你还能包容她吗?

因此也就有了这篇博客。

先上一个接口

public interface Subject {
    public String say(String name,int age);
    public void say();
}

真正实现类实现具体接口

public class RealSubject implements Subject {
    @Override
    public String say(String name, int age) {
        System.out.println("打印输出...");
        return "姓名:"+ name +",年龄:" + age;
    }

    @Override
    public void say() {
        System.out.println("我执行了....");
    }
}

动态代理测试类方法  不再具体指定是哪个实现类的代理,而是invoke()方法中的第三个形参,根据传入的不同的值利用反射技术动态实现代理功能。

public class DynaProxyDemo {
   

    @Test
    public void test(){
        //获得动态的代理对象----在运行时 在内存中动态的为RealSubject创建一个虚拟的代理对象
        //objProxy是代理对象 根据参数确定到底是谁的代理对象
        Subject objProxy = (Subject) Proxy.newProxyInstance(
                //与目标对象相同的类加载器
                RealSubject.class.getClassLoader(),
                //获得全部的接口
                new Class[]{Subject.class},
                //得到InvocationHandler接口的子类实现
                new InvocationHandler() {
                    @Override
                    //invoke 执行代理对象的方法
                    //method 代表目标对象的字节码对象
                    //args 代表目标对象的相应的方法的参数
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //反射
                        Object temp = method.invoke(new RealSubject(),args);
                        //System.out.println(temp);
                        return temp;
                    }
                }
        );
        String temp =objProxy.say("张三丰",30);
        System.out.println(temp);
        //objProxy.say();
    }
}

测试结果



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值