天天看點

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();*/
    }
}