设计模式

设计模式之代理模式

2018-12-18  本文已影响0人  sssssss_

一、代理模式的定义

代理模式(Proxy Patten):是结构型设计模式,为其他对象提供一种代理以控制对这个对象的访问。

二、代理模式的使用场景

当无法直接访问某对象、访问某个对象存在困难的情况下,可以通过一个代理对象来间接访问。为保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。

三、代理模式分类

四、静态代理模式

4.1静态代理模式 UML结构图

image

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从适用范围来区分静态代理和动态代理

六、代理模式在Android中的实际运用

七、实战之发送通知

八、总结

上一篇 下一篇

猜你喜欢

热点阅读