简介
代理模式:给目标对象提供一个代理对象,并由代理对象控制对目标对象访问。
代码实例
背景:水果店与第三方合作,开展了海外水果代购服务
设计
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部分的事项隐藏。
- 虚拟代理:如果要创建一个资源消耗较大的对象,可以先用一个代理对象表示,在真正需要的时候才真正创建。
- 保护代理:用代理对象控制对一个对象的访问,给不同的用户听过不同的访问权限。
- 只能引用:在引用原始对象的时候增加额外操作,并对指向原始的引用增加引用计数。
网友评论