设计模式之动态代理详解以及代码实现

设计模式:一些通用的解决固定问题的方式

代理模式

* 概念:
	1. 真实对象:被代理的对象
	2. 代理对象:
	3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
* 实现方式:
 	1. 静态代理:有一个类文件描述代理模式
 	2. 动态代理:在内存中形成代理类
		* 实现步骤:
			1. 代理对象和真实对象实现相同的接口
			2. 代理对象 = Proxy.newProxyInstance();
			3. 使用代理对象调用方法。
			4. 增强方法

		* 增强方式:
			1. 增强参数列表
			2. 增强返回值类型
			3. 增强方法体执行逻辑	

图解:

在这里插入图片描述

代码实现:

接口类

package cn.itcase.proxy;

public interface Proxy_In {
    public String saleComputer(double money);
    public String show();
}

真实对象

package cn.itcase.proxy;


public class Computer implements Proxy_In {

    @Override
    public String saleComputer(double money) {

        String sale = "我(代理)从厂家以"+money+"元进了一台电脑";
        System.out.println(sale);
        return "电脑";
    }

    @Override
    public String show() {
        System.out.println("展示电脑。。。");
        return null;
    }
}

代理对象

package cn.itcase.proxy;

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

public class Proxy_test {

    public static void main(String[] args) {
        Computer proxy_Computer = new Computer();
        /**创建一个动态代理
         * 第一个参数是需要加强的对象的类装载器,第二个是这个对象的接口数组,创建第三个参数是处理器进行逻辑处理
         * 返回一个处理完逻辑后的对象
         */
        Proxy_In o = (Proxy_In) Proxy.newProxyInstance(proxy_Computer.getClass().getClassLoader(), proxy_Computer.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *
             * @param proxy 代理对象
             * @param method 代理对象调用的方法
             * @param args 代理对象调用方法时候传递的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                //筛选调用的方法
                if (method.getName().equals("saleComputer")){
                    //增强参数:将原对象传来的价格进行处理
                    double money = (double) args[0];
                    money = money * 0.85;

                    //使用真实对象调用该方法。
                    // 下面这行代码=对象.方法(参数)  传入真实的对象和经过处理的参数
                    String obj = (String) method.invoke(proxy_Computer, money);
                    System.out.println("然后,我(代理)免费送货给客户");
                    //增强返回值
                    return obj+"+鼠标垫";

                }else {
                    //使用真实对象调用该方法。 下面这行代码=对象.方法(参数)
                    Object obj = method.invoke(proxy_Computer, args);
                    //增强返回值
                    return obj;
                }
            }
        });

        double money_user = 8000;
        System.out.println("客户花了"+money_user+"从我(代理)这里买了一台电脑");
        System.out.println("客户得到了:"+o.saleComputer(money_user));
    }
}

输出结果:

客户花了8000.0从我(代理)这里买了一台电脑

我(代理)从厂家以6800.0元进了一台电脑

然后,我(代理)免费送货给客户

客户得到了:电脑+鼠标垫

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值