简单代理模式(proxy pattern)

2018-07-26  本文已影响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

优点

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

缺点

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

应用场景

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

目的:

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

目的:减少系统的开销。

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

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

原文查看
源码下载

上一篇 下一篇

猜你喜欢

热点阅读