装饰器模式知识分享:Android (Kotlin) 与 iOS (Swift) 实现

news/2024/10/17 5:41:00/

# <a class=装饰器模式知识分享:Android (Kotlin) 与 iOS (Swift) 实现 🎨💡" />

装饰器模式(Decorator Pattern)是一种非常重要的设计模式,它允许我们在不修改已有对象的情况下,动态地为其添加新的行为和功能。
这种模式广泛用于 Android 和 iOS 的开发中,特别是在我们想要扩展现有功能,而不破坏已有代码时。让我们从 Android 和 iOS 两个角度,详细了解一下如何使用装饰器模式

什么是装饰器模式?🤔

装饰器模式的核心思想是将一个对象“包裹”起来,动态地给它添加新的行为,而不是直接修改或继承该对象的类。
换句话说,我们用“装饰器”来增强现有对象的功能,而无需改变它的源代码。

  • 装饰器模式的好处:
    1. 遵循开闭原则:对扩展开放,对修改封闭。
    2. 动态地扩展对象的功能,而不修改已有代码。
    3. 灵活性高,可以组合多个装饰器来增强对象。

Android (Kotlin) 实现装饰器模式 🧩📱

在 Android 开发中,装饰器模式常用于扩展 WebViewClientRecyclerView.Adapter 等类,来为现有功能增加新功能。

假设场景:

我们有一个 WebViewClient,已经实现了基本的功能。现在,我们想在页面加载完成时,打印出当前页面的 HTML 内容,而不影响原有功能。

实现步骤:

  1. 获取或创建原有的 WebViewClient 对象。
  2. 用一个新的 WebViewClient 包装原有对象,并在页面加载完成时,添加新的行为。
  3. 调用原有对象的方法,保留原有功能。

Kotlin 实现代码:

// 假设我们已经有一个 WebViewClient 实例
val originalWebViewClient = webView.webViewClient ?: WebViewClient()// 创建新的 WebViewClient,扩展其功能
webView.webViewClient = object : WebViewClient() {override fun onPageFinished(view: WebView?, url: String?) {// 调用原有的 onPageFinished 方法,保留现有功能originalWebViewClient.onPageFinished(view, url)// 添加新的功能:打印页面 HTMLview?.evaluateJavascript("""(function() {return document.documentElement.outerHTML;})();""".trimIndent()) { html ->Log.d("WebViewHTML", "HTML content: $html")}}
}

解释:

  • originalWebViewClient: 复用已有的 WebViewClient,避免功能丢失。
  • onPageFinished: 在页面加载完成后,我们调用原有的逻辑,并添加打印 HTML 的功能。

这种做法的好处:

  • 你无需修改已有的 WebViewClient 实现,只需包裹并扩展它。
  • 保证了原有功能的完整性,还能动态地添加新的行为。

iOS (Swift) 实现装饰器模式 🧩🍏

在 iOS 开发中,装饰器模式同样可以用来扩展对象的功能,常用于扩展 UIViewControllerUITableViewDelegate 等。Swift 的扩展性很强,我们可以利用协议、类扩展等手段来实现装饰器模式

假设场景:

我们有一个 WKNavigationDelegate,它负责处理网页的加载。现在,我们想在页面加载完成时,获取页面的 HTML 内容,并打印出来。

实现步骤:

  1. 创建一个原有的 WKNavigationDelegate 实例。
  2. 使用装饰器模式,通过扩展 WKWebView,为页面加载完成后添加新的行为。
  3. 保留原有 WKNavigationDelegate 的行为,同时扩展新功能。

Swift 实现代码:

// 原有的 WKNavigationDelegate 实现
class OriginalNavigationDelegate: NSObject, WKNavigationDelegate {func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {// 原有的页面加载完成处理print("Original page finished loading.")}
}// 扩展 WKWebView,添加打印 HTML 功能
extension WKWebView {func printHTMLContent() {self.evaluateJavaScript("document.documentElement.outerHTML.toString()") { result, error inif let html = result as? String {print("HTML content: \(html)")}}}
}// 创建新的装饰器类,包裹原有的 WKNavigationDelegate
class NavigationDelegateDecorator: NSObject, WKNavigationDelegate {private let wrapped: WKNavigationDelegateinit(wrapped: WKNavigationDelegate) {self.wrapped = wrapped}func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {// 调用原有的行为wrapped.webView?(webView, didFinish: navigation)// 添加新的功能:打印页面 HTMLwebView.printHTMLContent()}
}// 使用装饰器模式
let originalDelegate = OriginalNavigationDelegate()
let decoratedDelegate = NavigationDelegateDecorator(wrapped: originalDelegate)// 将装饰后的 delegate 设置给 WKWebView
webView.navigationDelegate = decoratedDelegate

解释:

  • OriginalNavigationDelegate: 原有的委托实现。
  • NavigationDelegateDecorator: 这是装饰器类,扩展了原有的委托功能。
  • printHTMLContent: 扩展了 WKWebView,在页面加载完成时打印 HTML。

这种做法的好处:

  • 你无需修改原有的 WKNavigationDelegate 逻辑。
  • 新增的功能和原有功能完全解耦,代码清晰且易于维护。

总结 ✨

装饰器模式是一种强大的设计模式,能够让我们在不修改已有代码的情况下,为对象动态地添加新功能。在 Android 和 iOS 开发中,装饰器模式尤其适用于扩展那些无法直接修改的类或对象,比如 WebViewClientWKNavigationDelegate 等。

  • Android (Kotlin):通过复用现有的 WebViewClient,并在其基础上添加新的行为,比如打印页面 HTML。
  • iOS (Swift):使用类扩展和委托装饰,动态为 WKNavigationDelegate 添加新功能,比如打印页面 HTML。

装饰器模式的优势在于其灵活性和可组合性。无论是 Android 还是 iOS,都可以利用这种模式,让代码更加模块化,维护更加容易。🎉

感谢阅读!


http://www.ppmy.cn/news/1539644.html

相关文章

网络七层架构

目录标题 网络七层架构从正确认识网络七层架构开始 网络七层架构 简介&#xff1a; 网络七层架构是指ISO/OSI模型&#xff0c;它是国际标准化组织&#xff08;ISO&#xff09;制定的一种用于计算机网络体系结构的参考模型。该模型将计算机网络的功能划分为七个层次&#xff0c…

windows 导出 oracle DMP文件

1.dba登录oracle sqlplus /orcl as sysdba 2.创建目录 授权目录 create directory bluesys1016 as C:\bluesys\DemoData; grant read,write on directory bluesys1016 to bluesys; 3.退出sqlplus exit 4.执行expdp expdp bluesys/bluesysorcl directorybluesys1016 dumpfil…

阿里 C++面试,算法题没做出来,,,

我本人是非科班学 C 后端和嵌入式的。在我面试的过程中&#xff0c;竟然得到了阿里​ C 研发工程师的面试机会。因为&#xff0c;阿里主要是用 Java 比较多&#xff0c;C 的岗位比较少​&#xff0c;所以感觉这个机会还是挺难得的。 阿里 C 研发工程师面试考了我一道类似于快速…

linux通过configfs方式开启uvc、uac、adb等功能

linux通过configfs方式开启uvc、uac、adb等功能 IamGroot2023 已于 2023-03-22 13:02:02 修改 阅读量3.1k 收藏 20 点赞数 3 文章标签&#xff1a; adb linux android Powered by 金山文档 版权 setusbconfig uvc&#xff1a;开启uvc功能。 切换到usb device模式&#xff1a; …

如何安装和使用 Git Large File Storage (LFS)

在现代软件开发中&#xff0c;我们经常需要处理大型文件&#xff0c;如图像、音频、视频或二进制文件。Git 在处理这些大文件时可能会遇到性能问题&#xff0c;因为 Git 会存储文件的每一个版本。为了解决这个问题&#xff0c;Git Large File Storage (LFS) 应运而生。Git LFS …

ros2 action相关

ros2 action相关 总体代码参考&#xff1a; 一定要先看这里的示例&#xff0c;后续是对这个示例的说明补充 重点关注execute中&#xff0c;思考action的客户端与服务端联动过程中需要的是&#xff0c;任务执行的一些状态信息交互&#xff0c;就能明补execute为什么这样写了 代…

Spring Boot实现大创项目监控与分析系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大创管理系统的相关信息成为必然。开发合适…

第九章 RabbitMQ消息可靠性之生产者

目录 一、引言 二、如何解决生产者可靠性 2.1. 生产者重连 2.1.1. 生产者重连配置 2.1.2. 开启生产者重连效果 2.2. 生产者确认 2.2.1. 生产者确认配置 2.2.2. 生产者确认代码实现 2.2.3. 运行效果 2.2.4. 其他代码实现方式 三、总结 一、引言 我们在实际项目过…