天天看点

017.代理模式

017.代理模式
017.代理模式
package com.item.designpattern;

/**
 * 1.真实类
 */
public class Lenovo implements SaleComputer
{
    @Override
    public String sale(double money)
    {
        System.out.println("客户花了"+money+"买了一台电脑!");
        return "联想电脑";
    }

    @Override
    public void show()
    {
        System.out.println("展示电脑");
    }
}      
package com.item.designpattern;


public interface SaleComputer
{
    public String sale(double money);

    public void show();
}      
package com.item.designpattern;


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

/**
 * 1.代理测试类
 */
public class ProxyTest
{
    public static void main(String[] args)
    {
        /**
         * 1.创建真实对象
         * 2.动态代理增强lenovo对象
         *      2.1类加载器,真实对象.getClass().getClassLoader()
         *      2.2接口数组  真实对象.getClass().getInterfaces()
         *      2.3处理器  new InvocationHandler()
         * 3.调用方法
         */
        Lenovo lenovo = new Lenovo();
        SaleComputer proxyLenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler()
        {
            /**
             * 1.代理逻辑进行编写的方法
             * 2.代理对象调用所有的方法都会触发该方法的执行
             * 3.invoke(Object proxy, Method method, Object[] args)的三个参数
             *      3.1 proxy:代理对象(其实指的是proxyLenovo)
             *      3.2 method:代理对象调用的方法被封装为的对象
             *      3.3 args: 代理对象调用的方法时,实际传递的参数
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
            {
               /* System.out.println("该方法执行了!");
                System.out.println(method.getName());
                System.out.println(args[0]);*/
                /**
                 * 1.增强参数
                 * 2.判断是否是sale方法
                 */
                if (method.getName().equals("sale"))
                {
                    //1.增强参数
                    double money = (double) args[0];
                    money = money * 0.85;
                    System.out.println("专车接你...");
                    //使用真实对象调该方法
                    String obj = (String) method.invoke(lenovo, money);
                    System.out.println("免费送货...");
                    //增强返回值类型
                    return obj+"_1200多送一个鼠标垫";
                }
                else
                {
                    Object obj = method.invoke(lenovo, args);
                    return obj;
                }

            }
        });
        String computer = proxyLenovo.sale(8000);
        System.out.println(computer);
      /*  proxyLenovo.show();*/
    }
}