转载请声明地址:http://blog.csdn.net/bxllove/article/details/65938416
1.简介
《代理模式》 在android 编程开发中是非常重要的设计模式之一 那么什么是代理模式呢? 说到代理 我们可以联想一下这个词汇在现实生活中都有谁(人或物)所充当着这种角色呢,中介,律师,快递 ..... 凡是担任第三方并服务于自己的都可以说是代理。那么在java 中所谓的代理模式和这个差不多,因为一般编程语言的设计模式都是仿着现实生活中的一些人的常为形态所设计的,所以理解起来并不是很难。
2.代理模式的定义
通过受委托代表某个对象所进行展开的活动向其它对象共开访问交流。
3.代理模式UML
4.代理模式的种类:
代理模式有两种 1.静态代理 2.动态代理 那么这两种又有什么区别呢? 动态模式通过反射机制生成被代理者的对象 在代理阶段不需要知道被代理的对象是谁,当执行代码时才进行代理的对象的传入 静态相反。
5.1静态模式
第一步:
public abstract class AbsShoping {
public abstract void buy();
}
第二步:实例化子类并发出意向 (想买机票但不愿出门)
public class PersionShop extends AbsShoping{
@Override
public void buy() {
System.out.println("买机票");
}
}
第三步:代理帮忙买机票 但要持有被代理者的对象(身份证PersionShop mpShop)
public class ProxyShoping extends AbsShoping {
private PersionShop mpShop;
public ProxyShoping(PersionShop mpShop) {
this.mpShop = mpShop;
}
@Override
public void buy() {
mpShop.buy();
}
}
第四步:
public class Client {
public static void main(String[] args) {
PersionShop mpShop = new PersionShop();
ProxyShoping proxy = new ProxyShoping(mpShop);
proxy.buy();
}
}
运行结果:买机票
5.2动态模式
第一步:
public interface AbsShoping {
public abstract void buy();
}
第二步:
public class PersionShop implements AbsShoping{
@Override
public void buy() {
System.out.println("买机票");
}
}
第三步:和静态模式的唯一区别就在这了静态模式代理者实现的是抽象的购物而这里需要实现InvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyShoping implements InvocationHandler {
private AbsShoping ob;
private AbsShoping proxy;//该引用将指向被代理的类;
public AbsShoping getProxy() {
return proxy;
}
public ProxyShoping(AbsShoping ob) {
this.ob = ob;
// 动态构造一个代理者
this.proxy = (AbsShoping) Proxy.newProxyInstance(
AbsShoping.class.getClassLoader(),
new Class<?>[] { AbsShoping.class }, this);
}
//调用被代理的类将在invoke方法执行
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = method.invoke(ob, args);
return result;
}
}
第四步:
public class Client {
public static void main(String[] args) {
AbsShoping proxy = new ProxyShoping(new PersionShop()).getProxy();
proxy.buy();
}
}
运行结果:买机票