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