美文网首页
结构型模式之代理模式

结构型模式之代理模式

作者: sunpy | 来源:发表于2018-12-16 20:44 被阅读4次
优秀.jpg

什么是代理模式

代理模式顾名思义就是使用一个代理类来代替原对象,来进行一些操作。按照我的理解:就是原对象委托给代理对象来处理。

代理模式的种类

静态代理、JDK代理、Cglib代理

静态代理

结构:


Proxy.png

抽象主题角色、具体主题角色、代理主题角色

/** 抽象主题角色 */
interface Subject {
    public void buy();
}

/** 具体主题角色 */
class Purchaser implements Subject {

    @Override
    public void buy() {
        System.out.println("Purchaser买啤酒!");
    }
}

/** 代理主题角色 */
class ProxyPurchaser implements Subject {

    private Purchaser purchaser;
    
    public ProxyPurchaser(Purchaser purchaser) {
        this.purchaser = purchaser;
    }

    @Override
    public void buy() {
        System.out.println("ProxyPurchaser代理Purchaser");
        purchaser.buy();
    }
}

测试:

public class ProxyTest {

    public static void main(String[] args) {
        Subject proxyPurchaser = new ProxyPurchaser(new Purchaser());
        proxyPurchaser.buy();
    }
}

结果:

ProxyPurchaser代理Purchaser
Purchaser买啤酒!

优点:可以做到不修改目标对象功能的前提下,对目标对象实现了扩展,遵循了开闭原则。
缺点:由于静态代理其本身的特点,代理类和目标对象实现同一个接口,同时这也是一个缺点,如果目标对象需要增加更多,那么需要增加更多的代理类。同时接口也在增加更多,都需要维护,这样很麻烦。

JDK代理

public class ProxyTest {

    public static void main(String[] args) {
        ProxyUtil proxyUtil = new ProxyUtil(new Purchaser());
        Subject subject = (Subject) proxyUtil.getProxyInstance();
        subject.buy();
    }
}

/** 抽象主题角色 */
interface Subject {
    public void buy();
}

/** 具体主题角色 */
class Purchaser implements Subject {

    @Override
    public void buy() {
        System.out.println("Purchaser买啤酒!");
    }
}

/** 代理工具类 */
class ProxyUtil implements InvocationHandler {

    private Object obj;
    
    public ProxyUtil(Object obj) {
        this.obj = obj;
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), 
                this);
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("ProxyPurchaser代理Purchaser");
        return method.invoke(obj, args);
    }
}

Cglib代理

public class ProxyTest {

    public static void main(String[] args) {
        Subject subject = new CglibUtil().getProxyInstance(Purchaser.class);
        subject.buy();
    }
}

/** 抽象主题角色 */
interface Subject {
    public void buy();
}

/** 具体主题角色 */
class Purchaser implements Subject {

    @Override
    public void buy() {
        System.out.println("Purchaser买啤酒!");
    }
}

/** 代理工具类 */
class CglibUtil implements MethodInterceptor {

    @SuppressWarnings("unchecked")
    public <T> T getProxyInstance(Class<T> clazz) {
        return (T) Enhancer.create(clazz, this);
    }
    
    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("ProxyPurchaser代理Purchaser");
        return proxy.invokeSuper(obj, args);
    }
}

参数解析:
intercept方法参数:
Object obj:表示要进行增强的对象
Method method:表示拦截的方法
Object[] args:基本数据类型需要传入其包装类型
MethodProxy proxy:表示对方法的代理
而实际上Cglib可以更灵活的使用:cglib动态代理的使用

代理模式和装饰器模式的区别

装饰器模式仅仅就是给原定的功能上加上了一层额外的业务逻辑进行了封装。
代理模式是代理原对象,代理模式的主要目得是为了代理原对象去执行。

相关文章

  • spring框架中的设计模式二

    在这篇文章中,介绍4种设计模式。结构型设计模式:代理和复合模式。行为型设计模式:策略和模板方法模式。 代理模式 面...

  • 设计模式分类汇总

    结构型 适配器模式 组合模式 桥接模式 代理模式 装饰者模式 门面模式 享元模式 行为型 责任链模式 命令模式 解...

  • 设计模式--代理模式

    目录 本文的结构如下: 引言 什么是代理模式 模式的结构 典型代码 代理模式分类 代码示例 代理模式和装饰者模式的...

  • Android进阶之光——设计模式(结构型设计模式)

    结构型设计模式 结构型设计模式是从程序的结构上解决模块之间的耦合问题 代理模式 代理模式也被称为委托模式。 定义:...

  • 设计模式之代理模式

    设计模式之代理模式 简介 代理模式是结构型设计模式。 当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过...

  • java设计模式-代理模式(Proxy)

    定义 代理模式是对象的结构模式。代理模式给某一个对象提供代理对象,并由代理对象控制对源对象的引用。 代理模式的结构...

  • android常用设计模式之代理设计模式

    定义:代理模式属结构型设计模式。为其他对象提供一种代理以控制对这个对象的访问。 代理模式结构图 在代理模式中有如下...

  • android常用设计模式之代理设计模式及动态代理原理

    定义:代理模式属结构型设计模式。为其他对象提供一种代理以控制对这个对象的访问。 代理模式结构图 在代理模式中有如下...

  • 设计模式之结构型模式

    3、设计模式之结构型模式 3.1 代理(Proxy)模式 3.1.1 引入案例: 前阵子疫情期间,为了打发时间竟然...

  • 设计模式[8]-代理模式-Proxy Pattern

    1. 代理模式 代理模式(Proxy Pattern)是常用的结构性设计模式,和装饰者模式非常相似,代理类和被代理...

网友评论

      本文标题:结构型模式之代理模式

      本文链接:https://www.haomeiwen.com/subject/jbtxkqtx.html