设计模式之代理模式
2018-12-18 本文已影响0人
sssssss_
一、代理模式的定义
代理模式(Proxy Patten):是结构型设计模式,为其他对象提供一种代理以控制对这个对象的访问。
二、代理模式的使用场景
当无法直接访问某对象、访问某个对象存在困难的情况下,可以通过一个代理对象来间接访问。为保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。
三、代理模式分类
-
静态代理:只能为给定接口下的实现类做代理,如果接口不同那么需要重新定义代理类,较为复杂,但是静态代理类更符合面向对象规则。
-
动态代理:通过反射机制动态生成代理者的对象,具体代理谁由执行阶段去决定。通过java提供的动态代理接口 InvocationHandler 的 invoke 方法来实现。为代理者与被代理者进行解耦,使两者没有直接的耦合关系。
四、静态代理模式
4.1静态代理模式 UML结构图
![](https://img.haomeiwen.com/i6491732/9128363ef8734f4a.png)
4.2静态代理模式代码实现
//抽象主题类
public interface Subject {
void visit();//一个普通业务方法
}
//实现抽象主题的真实主题类
public class RealSubject implements Subject {
@Override
public void visit() {
//RealSubject中visit的具体逻辑
System.out.println("RealSubject visit");
}
}
//代理类
public class ProxySubject implements Subject {
private RealSubject mSubject; //持有真实主题的逻辑
public ProxySubject(RealSubject mSubject) {
this.mSubject = mSubject;
}
@Override
public void visit() {
//通过真实主题引用的对象调用真实主题中的逻辑方法
mSubject.visit();
}
}
//客户类
public class Client {
public static void main(String[] args) {
//构造一个真实主题对象
RealSubject realSubject = new RealSubject();
//通过真实主题对象构造一个代理对象
ProxySubject proxySubject = new ProxySubject(realSubject);
//调用代理的相关方法
proxySubject.visit();
}
}
五、动态代理模式
5.1动态代理模式 UML结构图
5.2动态代理模式代码实现
//新增动态代理类
public class DynamicProxy implements InvocationHandler {
private Object obj;//被代理的类引用
public DynamicProxy(Object object) {
this.obj = object;
}
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
//调用被代理类对象的方法
Object result = method.invoke(obj, args);
return result;
}
}
//修改客户类
public class Client {
public static void main(String[] args) {
//构造真实主题对象
Subject realSubject = new RealSubject();
//构造一个动态代理
DynamicProxy proxy = new DynamicProxy(realSubject);
//获取被代理类的真实主题对象
ClassLoader loader = realSubject.getClass().getClassLoader();
//动态构造一个代理类
Subject proxysubject = (Subject) Proxy.newProxyInstance(loader,
new Class[]{Subject.class}, proxy);
//执行方法
proxysubject.visit();
}
}
5.3从适用范围来区分静态代理和动态代理
- 远程代理 Remote Proxy:为某个对象在不同的内存地址空间提供局部代理,是系统可以将Server部分的实现因此,以便Client可以不必考虑Server的存在。
- 虚拟代理 Virtual Proxy:使用一个代理对象表示一个十分耗资源的对象并在真正需要时才会创建。
- 保护代理 Protection Proxy:使用代理控制对原始对象的访问,该类型的代理常被用于原始对象有不同访问权限的情况。
- 智能引用 Smart Reference:在访问原始对象时执行一些自己附加操作并指向原始对象的引用计数。
六、代理模式在Android中的实际运用
- ActivityManagerProxy
- Binder跨进程通信机制与AIDL
- OKhttp