1.代理设计模式 - 定义
为其他对象提供一种代理,以控制对这个对象的访问,分为静态代理和动态代理。
2.静态代理
银行办卡 - 角色划分
2.1. 目标接口
2.2. 代理对象 - 银行的工作人员
2.3. 被代理的对象 - 我
目标接口
public interface IBank {
/**
* 申请办卡
*/
public void applyBank();
}
真实对象
public class Man implements IBank {
private String name;
public Man(String name){
this.name=name;
}
@Override
public void applyBank() {
System.out.println(name+"申请办卡");
}
}
代理对象——银行工作人员
public class BankWorker implements IBank {
private Man man;
public BankWorker(Man man){
this.man=man;
}
@Override
public void applyBank() {
System.out.println("开始受理");
man.applyBank();
System.out.println("操作完毕");
}
}
测试
Man man=new Man("Peakmain");
BankWorker worker=new BankWorker(man);
worker.applyBank();
3.动态代理对象
目标接口
public interface IBank {
/**
* 申请办卡
*/
public void applyBank();
/**
* 挂失
*/
public void lostBank();
}
真实对象-办卡人员
public class Man implements IBank {
private String name;
public Man(String name){
this.name=name;
}
@Override
public void applyBank() {
System.out.println(name+"申请办卡");
}
@Override
public void lostBank() {
System.out.println(name+"挂失卡");
}
}
动态代理生成对象
public class BankInvocationHandler implements InvocationHandler {
/**
* 被代理的对象
*/
private Object mObject;
public BankInvocationHandler(Object object){
this.mObject = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 执行方法 ,目标接口调用的方法都会来到这里面
System.out.println("开始受理");
// 调用被代理对象的方法,这里其实调用的就是 man 里面的 applyBank 方法
Object voidObject = method.invoke(mObject,args);
System.out.println("操作完毕");
return voidObject;
}
}
测试
Man man = new Man("Peakmain");
IBank bank = (IBank) Proxy.newProxyInstance(
IBank.class.getClassLoader()
, new Class<?>[]{IBank.class}
, new BankInvocationHandler(man));
bank.applyBank();
bank.lostBank();