Android设计模式:代理模式

简介

代理模式:给目标对象提供一个代理对象,并由代理对象控制对目标对象访问。

代码实例

背景:水果店与第三方合作,开展了海外水果代购服务

设计背景

设计

package 设计模式6

/**
 *@Description
 *@Author PC
 *@QQ 1578684787
 */

/**
 * 订单接口
 */

interface OrderService{
    fun saveOrder():Int
}

/**
 * 本地订单
 */
class OrderServiceImpl:OrderService{
    override fun saveOrder(): Int {
        println("下单成功 订单号:8888")
        return 8888
    }
}
/**
 * 海外订单
 */
class OutOrderServiceImpl:OrderService{
    override fun saveOrder(): Int {
        println("下单成功 订单号:6666")
        return 6666
    }

}
class ProxyOrder:OrderService{
    //真实的订单服务
    private val orderService = OutOrderServiceImpl()
    override fun saveOrder(): Int {
        println("开始海外下订单")
        return orderService.saveOrder()
    }

}
/**
 * 代理模式
 * 代理进口水果
 */
fun main() {
    val orderService = ProxyOrder().also { 
        it.saveOrder()
    }
}

测试结果


测试结果

当然,上方只是简单的说明场景,实战过程中还会遇到更复杂的场景(如动态调用等),只需要简单的转换应用就可以了。

优点

  • 代理作为调用者和真实主体的中间层,降低了模块间和系统的耦合性。
  • 可以以一个小对象代理一个大对象,达到优化系统提高运行速度的目的。
  • 代理对象能够控制调用者的访问权限,起到了保护真实主体的作用。

缺点

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

应用场景

当一个对象不能或者不想直接访问另一个对象时,可以通过一个代理对象来简介范根。为保证客户端使用的透明性,委托对象和代理对象要实现同样的接口。
北方恩的对象不想暴露全部内容时,可以通过代理去掉不想被访问的内容。
根据适用范围,代理模式可以分为以下几种:

  • 远程代理:为一个对象在不同的地址空间提供局部代表,这样系统可以将Server部分的事项隐藏。
  • 虚拟代理:如果要创建一个资源消耗较大的对象,可以先用一个代理对象表示,在真正需要的时候才真正创建。
  • 保护代理:用代理对象控制对一个对象的访问,给不同的用户听过不同的访问权限。
  • 只能引用:在引用原始对象的时候增加额外操作,并对指向原始的引用增加引用计数。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容