Android学习——代理设计模式
定义:为其他对象提供一种代理,以控制对这个对象的访问,分为静态代理和动态代理。
简单说就是让别人帮自己做事。下面使用银行办业务举例
1.静态代理
1.1. 目标接口
/**
* 银行办理业务 - 目标接口(业务)
*/
public interface IBank {
/**
* 申请办卡
*/
void applyBank();
/**
* 挂失
*/
void lostBank();
}
1.2. 代理对象 - 银行的工作人员
/**
* 银行办理业务 - 代理对象 - 银行的业务员
*/
public class BankWorker implements IBank{
private IBank bank;
/**
* 持有被代理的对象
* @param bank
*/
public BankWorker(IBank bank){
this.bank = bank;
}
@Override
public void applyBank() {
System.out.println("开始受理");
bank.applyBank();
System.out.println("操作完毕");
}
@Override
public void lostBank() {
System.out.println("开始受理");
bank.lostBank();
System.out.println("操作完毕");
}
}
1.3. 被代理的对象 - 我
/**
* 银行办理业务 - 被代理的对象 - 我们
*/
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 + " 申请挂失");
}
}
1.4 使用
public static void main(String[] args){
Man man = new Man("jenny");
BankWorker bankWorker = new BankWorker(man);
bankWorker.applyBank();
}
2.动态代理
Java 给我们提供了一套动态代理的机制
/**
* 银行办理业务 - 目标接口(业务)
*/
public interface IBank {
/**
* 申请办卡
*/
void applyBank();
/**
* 挂失
*/
void lostBank();
/**
* 额外业务
*/
void extraBank();
}
/**
* 银行办理业务 - 被代理的对象 - 我们
*/
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 + " 申请挂失");
}
@Override
public void extraBank() {
System.out.println(name + " 额外业务");
}
}
/**
* 银行办理业务 - 动态代理 - InvocationHandler
*/
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;
}
}
public static void main(String[] args) {
Man man = new Man("jenny");
IBank bank =
// 返回的是 IBank 的一个实例对象,这个对象是由 Java 给我们创建的 ,调用的是 jni
(IBank) Proxy.newProxyInstance(
IBank.class.getClassLoader(), // ClassLoader
new Class<?>[]{IBank.class}, // 目标接口
new BankInvocationHandler(man) // InvocationHandler (这个类是关键)
);
// 当调用这个方法的时候会来到 BankInvocationHandler 的 invoke 方法
bank.applyBank();
bank.lostBank();
bank.extraBank();
}