Android设计模式详解之代理模式

news2025/1/13 15:42:03

前言

代理模式也称为委托模式,是一种结构型设计模式;

定义:为其他对象提供一种代理以控制对这个对象的访问;

使用场景:无法或不想直接访问某个对象访问某个对象存在困难时,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口;

UML类图:
代理模式UML类图

  • Subject:抽象主题类,该类的主要职责是申明真实主题与代理的共同接口方法,该类即可以是一个抽象类也可以是一个接口;
  • RealSubject:真实主题类,该类也称为被委托类或被代理类,该类定义了代理所表示的真实对象,由其执行具体的业务逻辑方法,而客户类则通过代理类间接地调用真实主题类中定义的方法;
  • ProxySubject:代理类,该类也称为委托类或代理类,该类持有一个对真实主题类的引用,在其所实现的接口方法中调用真实主题类中响应的接口方法执行,以此起到代理的作用;
  • Client:客户端类,使用代理类;

静态代理

定义:代理类在编译阶段生成,在程序运行之前就已经存在的代理模式,称为静态代理;

这里我们以租客租房为例,租客租房一般会找对应的租房中介,租房中介负责租房,同样,办理退房的时候也交给中介去处理即可;

示例代码

  • 定义租房抽象主题接口,IRental
/**
 * 租房,抽象主题角色
 */
interface IRental {
    /**
     * 租房
     */
    fun renting()

    /**
     * 退租
     */
    fun rentingOut()
}
  • 定义租客类,Tenant
/**
 * 租客,真实主题类
 */
class Tenant(private val name: String) : IRental {
    override fun renting() {
        println("$name 办理租房手续")
    }

    override fun rentingOut() {
        println("$name 办理退房手续")
    }
}
  • 定义租房中介,RentalProxy
/**
 * 租房中介,代理类
 */
class RentalProxy(private val rental: IRental) : IRental {
    override fun renting() {
        rental.renting()
    }

    override fun rentingOut() {
        rental.rentingOut()
    }
}
  • 编写测试类验证
object Test {

    @JvmStatic
    fun main(args: Array<String>) {
        //定义租客
        val tenant = Tenant("Alice")
        //租房中介
        val rentalProxy = RentalProxy(tenant)
        rentalProxy.renting()
        println("------------------")
        rentalProxy.rentingOut()
    }
}

输出结果:

Alice 办理租房手续
------------------
Alice 办理退房手续

优点:
静态代理对客户端隐藏了被代理类接口的具体实现类,在一定程度上实现了解耦合,同时提高了安全性;

缺点:

  • 静态代理类需要实现被代理类的接口,并实现其方法,造成了代码的大量冗余;
  • 静态代理只能对某个固定接口的实现类进行代理服务,其灵活性不强;

动态代理

由于静态代理所存在的问题,才有了动态代理

定义:在程序运行期,创建目标对象的代理对象,对目标对象中的方法进行功能性增强的一种技术。

也就是说代理类是在程序运行时才产生的;

在java中使用Proxy类的newProxyInstance()方法去创建一个代理类的实例对象;

示例代码

我们还是以租客租房为例,这里通过动态代理来实现;

  • 定义租房抽象主题接口,IRental
/**
 * 租房,抽象主题角色
 */
interface IRental {
    /**
     * 租房
     */
    fun renting()

    /**
     * 退租
     */
    fun rentingOut()
}
  • 定义租客类,Tenant
/**
 * 租客,真实主题类
 */
class Tenant(private val name: String) : IRental {
    override fun renting() {
        println("$name 办理租房手续")
    }

    override fun rentingOut() {
        println("$name 办理退房手续")
    }
}
  • 实现InvocationHandler接口TenantInvocationHandler
class TenantInvocationHandler(private val tenant: IRental) : InvocationHandler {
    override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any? {
        return method?.invoke(tenant) //当调用被代理对象的方法时,都在统一到这里执行
    }
}
  • 使用动态代理实现租房退房
object Test {

    @JvmStatic
    fun main(args: Array<String>) {
        //定义租客
        val tenant = Tenant("Alice")
        //使用动态代理
        val proxy = Proxy.newProxyInstance(
            tenant::class.java.classLoader,
            arrayOf(IRental::class.java),
            TenantInvocationHandler(tenant)
        ) as IRental
        proxy.renting()
        println("----------------------")
        proxy.rentingOut()
    }
}

结果输出:

Alice 办理租房手续
----------------------
Alice 办理退房手续

优点:

  • 可以在不改变方法源码的情况下,实现对方法功能的增强,提高代码复用性。
  • 非常灵活,支持任意接口类型的实现类对象做代理,也可以直接接本身做代理;

如果小伙伴对动态代理的实现原理感兴趣,可以移步:Android动态代理源码分析

Android源码中的代理模式

  • Binder进程间通信原理,通过AIDL实现进程间通信,都会生成代理类,最终客户端通过代理类调用远程服务的方法;
  • Retrofit的实现,高明的动态代理模式使用,这里不再赘述,感兴趣的小伙伴可以参考:Retrofit原理解析

总结

代理模式基本没有什么缺点可言,尤其是动态代理,在Android开发中运用十分广泛,值得我们深入学习;

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css实现圆环、渐变色圆环的多种方式

css实现圆环、渐变色圆环的多种方式一、实现圆环方法具体如下&#xff1a;1. 两个div标签的叠加2.使用伪元素&#xff0c;before&#xff0f;after3. 使用border4. 使用border-shadow5. 使用radial-gradient二、实现渐变色圆环方法具体如下&#xff1a;1.background:linear-gra…

详细记录拉链表的实现过程

面试中被问到了&#xff0c;想了会儿思路混乱没答好&#xff0c;还是理解的不够深刻&#xff0c;重新好好理解记录一下~ 拉链表的用途&#xff0c;主要是用来在数仓中记录业务库数据的全部历史信息和当前最新信息&#xff0c;也就是用来实现对渐变维的记录。数仓中对渐变维的记…

.NET和JavaScript控件丨Infragistics功能简介

使用Infragistics Ultimate UI/UX工具包简化开发&#xff0c;提供综合的企业级 UI控件库和使用Indigo.Design的 UX设计-开发协作工具 -一个完整的设计到代码系统- 集成原型、设计系统、用户测试、应用程序构建和代码生成。 终极开发者工具包 为任何平台上的任何设备设计、现代…

minikube start

因为要安装的中间件需要运行在k8s的环境里。官方推荐用minikube 运行minikube start时遇到问题。 容器下载速度为0 &#xff08;没有截屏&#xff09;kubectl初始化超时 initial timeout of 40s passed: 解决问题1&#xff0c;需要加上–image-mirror-countrycn’参数。如果…

长短期记忆网络(LSTM)

长短期记忆网络有三种类型的门&#xff1a;输入门、遗忘门和输出门。 长短期记忆网络的隐藏层输出包括“隐状态”和“记忆元”。只有隐状态会传递到输出层&#xff0c;而记忆元完全属于内部信息。 长短期记忆网络可以缓解梯度消失和梯度爆炸。 由于序列的长距离依赖性&#…

27移除元素--双指针(快慢指针)

27移除元素–双指针&#xff08;快慢指针&#xff09; 移除元素这道题看起来很简单&#xff0c;但其蕴含的快慢指针的思想十分重要。 双for循环&#xff08;暴力法&#xff09;-- O(n2n^2n2) 使用第1个for循环 i 遍历数组所有元素 使用第2个for循环从 i 开始进行数组元素的前移…

骨传导耳机伤耳朵吗、骨传导耳机适合适用的人群有哪些?

事实上&#xff0c;骨传导耳机是对耳朵最健康的一种耳机了&#xff0c;下面就来详细说说这种耳机。 骨传导耳机是以人的骨骼为介质&#xff0c;不经过外耳道和耳膜&#xff0c;将声音传递给听觉器官的耳机。他对人的耳朵损害相比起传统的耳机损害更小&#xff0c;因为听力受损…

JavaSE笔记——Lambda表达式

文章目录前言一、第一个Lambda表达式二、如何辨别Lambda表达式三、引用值&#xff0c;而不是变量四、函数接口五、类型推断总结前言 Java 8 的最大变化是引入了 Lambda 表达式——一种紧凑的、传递行为的方式。 一、第一个Lambda表达式 Swing 是一个与平台无关的 Java 类库&a…

redhat7.6+grid 11.2.0.4部署遇到各种问题

一、add cluster node时&#xff0c;卡住 两个节点时间不同步&#xff0c;设置时间同步即可 二、部署Redhat7.6oracle11g部署中的bug Oracle 11.2.0.4 部署rac过程中&#xff0c;需要运行root.sh脚本报错。提示&#xff1a; ohasd集群无法启动。该补丁修改ohasd无法启动的问题…

红外成像系统测试

通常人们把红外辐射称为红外光、红外线。实际上其波段是指其波长约在0.75μm到1000μm的电磁波。人们将其划分为近、中、远红外三部分。近红外指波长为0.75-3.0μm;中红外指波长为3.0-20μm;远红外则指波长为20-1000μm。由于大气对红外辐射的吸收,只留下三个重要的“窗口”…

一把巴枪,和被改变的菜鸟驿站站长们

成立9年的菜鸟物流一直在答题。如果说之前这张答卷更多的标签是面向物流前端的配送和分拣等&#xff0c;那么如今&#xff0c;它的更多答案已经不单纯是前端的流通和连接&#xff0c;更有最末端基于科技对人的温度和赋能。 作者|丰兰 出品|产业家 数字化&#xff0c;正在…

少儿Python每日一题(6):角谷猜想

原题解答 本次的题目如下所示&#xff08;原题出处&#xff1a;NOC&#xff09;&#xff1a; 角谷猜想&#xff1a;以一个正整数n为例&#xff0c;如果n为偶数&#xff0c;就将它变为n/2&#xff1b;如果除后变成奇数&#xff0c;则将它乘3加1&#xff08;即3n1&#xff09;。…

latex常用语法速查

本文针对overleaf在线使用latex的情况编写。 文章目录文档结构要点导入图片使用表格添加引用参考资料文档结构 文档类型设置 \documentclass[12pt,article]{book} % []中设置文档格式&#xff0c;文档字体大小默认为10pt&#xff0c;article指定文档用纸类型&#xff0c;其他…

【金猿人物展】龙盈智达首席数据科学家王彦博:量子科技为AI大数据创新发展注入新动能...

‍王彦博本文由龙盈智达首席数据科学家王彦博撰写并投递参与“数据猿年度金猿策划活动——2022大数据产业趋势人物榜单及奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业回顾2022年大数据行业发展&#xff0c;令人感触最深的是数字经济时代对“数据安全”和“数…

基于自主可控的新型基础测绘与实景三维中国建设

实景三维中国作为强赋能、稳基底、重应用的新型基础设施&#xff0c;是打造数字中国、数字经济、数字政府的核心资源&#xff0c;其关键技术的掌握已经成为撬动社会生产&#xff0c;促进行业良性内循环&#xff0c;引发国家数字资源合理分配的重中之重。 ▲实景三维工程技术研究…

小程序入门01

目录 1.什么是小程序 2.小程序可以干什么&#xff1f; 3.相关资料 4.入门 4.1 申请账号 4.2 安装第一个小程序 4.3 了解程序 1.什么是小程序 2017年度百度百科十大热词之一 微信小程序&#xff08;wei xin xiao cheng xu&#xff09;&#xff0c;简称小程序&#xff0c;英文…

FreeSWITCH在视频会议中的实践经验

点击上方“LiveVideoStack”关注我们▲扫描图中二维码或点击阅读原文▲了解音视频技术大会更多信息// 编者按&#xff1a;视频会议已成为日常办公不可或缺的一部分&#xff0c;为远程交流的人们提供了许多便利。本次RTSCon 2022会议&#xff0c;由RTS社区和LiveVideoStack音视…

Win10的两个实用技巧系列之设置鼠标指针、红警玩不了怎么办?

win10系统怎么设置鼠标指针在打字时隐藏? win10隐藏鼠标指针的方法 win10系统怎么设置鼠标指针在打字时隐藏&#xff1f;win10系统输入文字的时候&#xff0c;想要隐藏鼠标指针&#xff0c;该怎么操作呢&#xff1f;下面我们就来看看win10隐藏鼠标指针的方法 win10如何隐藏鼠…

Android中的属性动画

在属性动画出来之前&#xff0c;Android系统提供的动画只有帧动画和View动画。View动画大家可能知道&#xff0c;它提供了AlphaAnimation(透明度)&#xff0c;RotateAnimation(负责旋转)&#xff0c;TranslateAnimation(负责移动)&#xff0c;ScaleAnimation(负责缩放)这4种动画…

2022年广西建筑安全员考试真题题库及答案

百分百题库提供建筑安全员考试试题、安全员证考试真题、安全员证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 100.《中华人民共和国建筑法》规定,建设单位申请领取施工许可证,应当具备下列条件有() A.已经办理该建筑工程用地批准手续…