美文网首页
简单代理模式(proxy pattern)

简单代理模式(proxy pattern)

作者: 一只笔 | 来源:发表于2018-07-26 23:57 被阅读0次

    定义

    给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
    通过引入代理对象的方式来间接访问目标对象

    • 例子:通过代理购买电脑

    步骤1: 创建接口,暴露提供对外的能力

    /**
     *抽象对象接口,对外提供的能力
     */
    interface ISubject {
        //购买电脑
        fun buyComputer()
    }
    

    步骤2:真实实业务现对象

    /**
     * 真实实业务现对象
     */
    class RealSubject : ISubject {
        override fun buyComputer() {
            println("我去买电脑")
        }
    }
    

    步骤3: 代理的实现对象

    /**
     * 代理的实现对象
     */
    class ProxySubject : ISubject {
        //创建真实的实现
        private val realSubject = RealSubject()
    
        override fun buyComputer() {
            //调用真实的实现对象
            realSubject.buyComputer()
            //调用额外操作
            wrapComputer()
        }
    
        //代理提供额外的操作
        private fun wrapComputer() {
            println("代理包装电脑")
        }
    }
    
    

    步骤4 使用

    fun main(args: Array<String>) {
        //通过代理进行使用
        val subject = ProxySubject()
        subject.buyComputer()
    }
    

    输出结果:


    image.png

    优点

    协调调用者和被调用者,降低了系统的耦合度
    代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用

    缺点

    由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢;
    实现代理模式需要额外的工作(有些代理模式的实现非常复杂),从而增加了系统实现的复杂度。

    应用场景

    当需要为一个对象再不同的地址空间提供局部的代表时
    此时的代理模式称为远程代理:为一个对象在不同的地址空间提供局部代表。

    目的:

    隐藏一个对象存在于不同地址空间的事实;
    远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
    当需要创建开销非常大的对象时
    此时的代理模式称为虚拟代理:通过使用过一个小的对象代理一个大对象。

    目的:减少系统的开销。

    当需要控制对原始对象的访问时
    此时的代理模式称为保护代理:控制目标对象的访问,给不同用户提供不同的访问权限
    目的:用来控制对真实对象的访问权限

    当需要在访问对象时附加额外操作时
    此时的代理模式称为智能引用代理,额外操作包括耗时操作、计算访问次数等等
    目的:在不影响对象类的情况下,在访问对象时进行更多的操作

    原文查看
    源码下载

    相关文章

      网友评论

          本文标题:简单代理模式(proxy pattern)

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