Android进阶之设计模式
代理模式
定义: 为其他对象提供一种代理以控制对这个对象的访问.
使用场景: 当无法或不想直接访问某个对象或者访问某个对象存在困难时可以通过一个代理对象来简洁访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口.
优点:
- 远程代理: 为一个对象在不同的地址空间提供局部代表,这样系统可以将 Server 部分的实现隐藏.
- 虚拟代理: 使用一个代理对象表示一个十分耗费资源的对象并在真正需要时才创建.
- 安全代理: 用来控制真实对象访问时的权限,一般用于真实对象有不同的访问权限.
- 智能代理: 当调用真实的对象时,可以自动释放它;或者访问一个实际对象时,检查是够已经能够锁定它,以确保其他对象不能改变它.
优点:
- 真实主题类就是实现世纪的业务逻辑,不用关系其他非本职的工作.
- 真实主题类随时都会发生变化;但是因为它实现了公共的接口,所以代理类可以不做任何修改就能够使用.
例子:
//抽象主题类
public abstract class Subject {
/**
* 一个普通的业务方法
* */
public abstract void visit();
}
//实现抽象主题的真实主题类
public class RealSubject extends Subject {
@Override
public void visit() {
//RealSubject 中visit 的具体逻辑
System.out.println("Real subject");
}
}
//代理类
public class ProxySubject extends Subject{
private RealSubject realSubject;//代理类持有真实主题的引用
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void visit() {
//通过真实主题引用的对象调用真实主题的逻辑方法
realSubject.visit();
}
}
client 类
public static void main(String[] args) {
//构造一个真实主题对象
RealSubject realSubject = new RealSubject();
//通过真实主题对象构造一个代理对象
ProxySubject proxySubject = new ProxySubject(realSubject);
//调用代理的相关方法
proxySubject.visit();
}
静态代理实例:
public interface ILawsuit {
//提交申请
void submit();
//开始举证
void burden();
//开始辩护
void defend();
//诉讼完成
void finish();
}
public class XiaoMin implements ILawsuit {
@Override
public void submit() {
//老板欠小民工资,小民申请仲裁
System.out.println("老板拖欠工资,申请仲裁");
}
@Override
public void burden() {
//证据充足
System.out.println("这是合同书和过去一年的银行工资流水");
}
@Override
public void defend() {
//铁证如山
System.out.println("证据确凿,不需要再说啥了");
}
@Override
public void finish() {
//结果必赢
System.out.println("诉讼成功!");
}
}
public class Lawyer implements ILawsuit{
private ILawsuit lawsuit;
public Lawyer(ILawsuit lawsuit) {
this.lawsuit = lawsuit;
}
@Override
public void submit() {
lawsuit.submit();
}
@Override
public void burden() {
lawsuit.burden();
}
@Override
public void defend() {
lawsuit.defend();
}
@Override
public void finish() {
lawsuit.finish();
}
}
public static void main(String[] args) {
//构造一个小民
ILawsuit xiaomin = new XiaoMin();
//构造一个代理律师并将小民作为构造参数传递进去
ILawsuit lawsuit = new Lawyer(xiaomin);
lawsuit.submit();
lawsuit.burden();
lawsuit.defend();
lawsuit.finish();
}
如果想代理其他人的,就要用到 动态代理:
动态代理类
public class DynamicProxy implements InvocationHandler{
private Object obj;
public DynamicProxy(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(obj,args);
return result;
}
}
client 类:
public static void main(String[] args) {
//构造一个小民
ILawsuit xiaomin = new XiaoMin();
//构造一个动态代理
DynamicProxy proxy = new DynamicProxy(xiaomin);
//获取被代理类的小民的 classLoader
ClassLoader loader = xiaomin.getClass().getClassLoader();
//动态构造一个代理者律师
ILawsuit lawsuit = (ILawsuit) Proxy.newProxyInstance(loader,
new Class[]{ ILawsuit.class},proxy);
lawsuit.submit();
lawsuit.burden();
lawsuit.defend();
lawsuit.finish();
}