前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式 -- 代理模式

设计模式 -- 代理模式

作者头像
xy_ss
发布2023-11-22 09:27:10
1200
发布2023-11-22 09:27:10
举报
文章被收录于专栏:浮躁的喧嚣浮躁的喧嚣

表述 (结构型模式)

为其他对象(A)提供一种代理对象(B),并由改代理对象(B)控制对该对象(A)的访问

在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务

代理模式类图

代理模式类图

  • Subject(协议):定义代理和委托的共同方法
  • RealSubject(真实角色):根据指定的协议,委托代理去完成实现指定方法
  • Proxy(代理角色):根据指定的协议,实现委托需要实现的方法

优点

  • 具有良好的扩展性。委托的业务逻辑可能会随时改变,当有新增功能,只需要在协议中增加方法就能不影响原有功能的情况下增加新功能
  • 有利于代码的封装。如果一个类,实现了某个协议,那么这个协议中的属性或方法就不必公有化,就可以被定义协议的类调用。这样可以减少一个类暴露给外部的方法
  • 有利于程序的结构化与层次化。一个协议往往是解决某一个问题,对于一个其他的不过却类似的问题,我们只用再次实现协议即可,避免了自己再次构思一组方法,提高代码的复用性

示例

需求V1 :不想做饭,想用APP点个外卖

协议类

代码语言:javascript
复制
protocol DoSomethingDelegate {
    func buySomething()
}

委托类

代码语言:javascript
复制
class Person  {
    weak var delegate : APP?
    
    func buy() {
        if self.delegate != nil && ((self.delegate?.buySomething) != nil) {
            self.delegate?.buySomething()
        }
    }
}

代理类

代码语言:javascript
复制
class APP :DoSomethingDelegate{
   
    func buySomething() {
        print("外卖")
    }
}

客户端调用

代码语言:javascript
复制
let per = Person.init()
let app = APP.init()
per.delegate = app
per.buy()

log:
//外卖
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 表述 (结构型模式)
  • 代理模式类图
  • 优点
  • 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档