设计模式:一些通用的解决固定问题的方式
代理模式
* 概念:
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元进了一台电脑
然后,我(代理)免费送货给客户
客户得到了:电脑+鼠标垫