1.静态代理模式
为其他对象提供一种代理,以控制对这个对象的访问
interface Subject{
void action();
}
//被代理类
class SubjectImpl implements Subject{
@Override
public void action() {
Log.e("lyl123", "action()");
}
}
//代理类
class ProxySubject implements Subject{
Subject o;
ProxySubject(){
this.o = new SubjectImpl();
}
@Override
public void action() {
o.action();
}
}
使用:虽然调用的是ProxySubject的action方法,最终执行的是Subject的action方法。
ProxySubject subject = new ProxySubject();
subject.action();
2.动态代理模式
动态的创建代理类:使用接口InvocationHandler
interface ClothProduct{
void productCloth();
}
class QiPiLang implements ClothProduct{
@Override
public void productCloth() {
Log.e("lyl123", "productCloth()");
}
}
//动态代理模式
class MyInvocationHandler implements InvocationHandler{
Object obj;//被代理类对象的声明
public Object blink(Object obj){
this.obj = obj;//实例化被代理类对象
Log.e("lyl123", "obj =" + obj);
//返回代理类对象
//参1:代理类和被代理类的类加载器一样;参2:二者实现的接口也相同。
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 通过log输出参数proxy时,会报错,但通过if语句判断,结果proxy的值不为null。
// 且debug调试时也不会进入invoke方法
// Log.e("lyl123", "proxy = " + proxy);
if (null == proxy){
Log.e("lyl123", "proxy is null");
} else {
Log.e("lyl123", "proxy not null ," + proxy.getClass().getSimpleName());
}
return method.invoke(obj, args);
}
}
使用:
QiPiLang qiPiLang = new QiPiLang();
MyInvocationHandler handler = new MyInvocationHandler();
ClothProduct product = (ClothProduct) handler.blink(qiPiLang);
product.productCloth();
SubjectImpl realSubject = new SubjectImpl();
Subject sub = (Subject) handler.blink(realSubject);
sub.action();