设计模式(十二):代理模式,动态代理与静态代理

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

优点: 1、职责清晰。 2、高扩展性。 3、智能化。

缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

代理对象和真实对象都实现同一个接口类,真正工作的是真实对象

例子:

如果你想找个歌星出台唱歌,你不直接和歌星接触,而是先找到经纪人,即他的代理,沟通好了再请歌星。

创建实际工作的对象:

public interface Subject {
    void doWork();
}


public class RealSubject implements Subject {
    @Override
    public void doWork() {
        System.out.println("歌星唱歌");
    }
}

创建代理

public class Proxy implements Subject {
    private RealSubject realSubject;
    @Override
    public void doWork() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        System.out.println("与经济人谈判");
        realSubject.doWork();
        System.out.println("给经纪人钱");
    }
}

执行:

public class ProxyMain {

    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.doWork();
    }
}

输出:

与经济人谈判
歌星唱歌
给经纪人钱

a以上是静态代理:

        现在可以看到,代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。

        上面介绍的是静态代理的内容,为什么叫做静态呢?因为它的类型是事先预定好的,比如上面代码中的 Cinema 这个类。下面要介绍的内容就是动态代理。

动态代理

  1. 实现InvocationHandler接口创建自己的调用处理器
  2. 给Proxy类提供ClassLoader和代理接口类型数组创建动态代理类
  3. 以调用处理器类型为参数,利用反射机制得到动态代理类的构造函数
  4. 以调用处理器对象为参数,利用动态代理类的构造函数创建动态代理类对象

区别

  1. 代理分为静态代理和动态代理两种。
  2. 静态代理,代理类需要自己编写代码写成。

动态代理,代理类通过 Proxy.newInstance() 方法生成。

  1. 不管是静态代理还是动态代理,代理与被代理者都要实现两样接口,它们的实质是面向接口编程。
  2. 静态代理和动态代理的区别是在于要不要开发者自己定义 Proxy 类。
  3. 动态代理通过 Proxy 动态生成 proxy class,但是它也指定了一个 InvocationHandler 的实现类。
  4. 代理模式本质上的目的是为了增强现有代码的功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值