【Kotlin设计模式】Kotlin实现外观模式

news2024/12/28 18:39:33

前言


外观模式(Facade Pattern)是一种结构型设计模式,旨在为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口,使得这一子系统更加容易使用。它将复杂的子系统封装在一个简单的接口后面,从而降低了客户端的复杂性。

在这里插入图片描述


实现


我们以银行APP业务举个例子,其中包含多个子系统,如用户验证、账户管理、交易处理和通知服务,我们用外观模式来简化子系统的操作,让用户能够轻松的使用银行系统功能而不用考虑底层复杂的实现细节。首先要定义以下子系统:

1、用户验证(UserAuthentication)

负责验证用户身份的子系统


/**
 * 用户认证
 */
class UserAuthentication {

    fun validateUser(userId: String, password: String): Boolean {
        println("System Validating user...")
        return userId == "Ho" && password == "123456"
    }
}


2、账户管理 (AccountManager)*

负责账户查询和更新的子系统


class AccountManager {

    fun getBalance(accountId: String): Double {
        println("Fetching balance for account: $accountId")
        return 1000.0
    }

    fun updateBalance(accountId: String, amount: Double) {
        println("Updating balance for account: $accountId by amount: $amount")
    }
}


3、交易处理 (TransactionManager)

负责执行交易的子系统

/**
 * 交易处理
 */
class TransactionManager {
    fun makeTransaction(fromAccount: String, toAccount: String, amount: Double) {
        println("Processing transaction from $fromAccount to $toAccount of amount $amount")
    }
}


4、通知服务 (NotificationService)

负责通知用户交易状态的子系统


/**
 * 通知服务
 */
class NotificationService {
    fun sendNotification(userId: String, message: String) {
        println("Sending notification to $userId: $message")
    }
}


5、外观类

定义外观类BankingFacade,将子系统对象作为外观类的构成参数传入,模拟对客户提供方法,比如转账transferMoney,验证用户、校验余额、处理交易、以及通知都在内部就行


class BankingFacade(
    private val auth: UserAuthentication,
    private val accountManager: AccountManager,
    private val transactionManager: TransactionManager,
    private val notificationService: NotificationService
) {

    fun transferMoney(userId: String, password: String, fromAccount: String, toAccount: String, amount: Double) {
        // 验证用户
        if (!auth.validateUser(userId, password)) {
            println("Authentication failed for user: $userId")
            return
        }

        // 检查账户余额
        val balance = accountManager.getBalance(fromAccount)
        if (balance < amount) {
            println("Insufficient funds in account: $fromAccount")
            notificationService.sendNotification(userId, "Transaction failed due to insufficient funds.")
            return
        }

        // 处理交易
        transactionManager.makeTransaction(fromAccount, toAccount, amount)
        accountManager.updateBalance(fromAccount, -amount)
        accountManager.updateBalance(toAccount, amount)

        // 发送通知
        notificationService.sendNotification(userId, "Transaction of $amount from $fromAccount to $toAccount completed successfully.")
    }

}

客户端使用外观类进行业务操作。

// 创建子系统对象
val auth = UserAuthentication()
val accountManager = AccountManager()
val transactionManager = TransactionManager()
val notificationService = NotificationService()

// 创建外观对象
val bankingFacade = BankingFacade(auth, accountManager, transactionManager, notificationService)

// 执行转账操作
bankingFacade.transferMoney("Ho", "123456", "****6787", "****6291", 100.0)


应用

Android中,外观模式广泛用于简化API的使用。比如以下


1、媒体播放MediaPlayer

MediaPlayer是一个非常典型的外观模式应用示例。它封装了音频和视频播放的复杂操作,提供了一个简单的接口供开发者使用。

子系统:音频解码、视频解码、缓冲处理、数据流处理等。
外观接口:MediaPlayer类提供了一系列简单的接口,如start()pause()stop()等,让开发者无需关心底层复杂的实现。


val mediaPlayer = MediaPlayer().apply {
    setDataSource("audio_file.mp3")
    prepare()
    start()
}

2、摄像头CameraX

CameraX库封装了对摄像头的操作,提供了简单且一致的API来处理图像捕获、预览和图像分析。

子系统:相机设备的选择、会话管理、图像捕获、焦点和曝光控制等。
外观接口:CameraX提供了一个简化的API,使得摄像头的使用更加直观和易于管理。


val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
    val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
    val preview = Preview.Builder().build().also {
        it.setSurfaceProvider(previewView.surfaceProvider)
    }
    val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
    cameraProvider.bindToLifecycle(this, cameraSelector, preview)
}, ContextCompat.getMainExecutor(this))

3、连接管理类ConnectivityManager

ConnectivityManager提供了一个接口来监视和管理设备的网络连接。它封装了不同网络类型(如Wi-Fi、移动数据、蓝牙等)的连接管理,并提供了统一的接口。

子系统:不同网络类型的连接管理、状态监控、网络切换等。
外观接口:ConnectivityManager提供了一个简化的接口来检测网络状态和进行网络操作。


val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connectivityManager.activeNetworkInfo
if (networkInfo?.isConnected == true) {
    // 已连接到网络
}


总结

外观模式通过提供一个简化的接口,将复杂的子系统封装起来,降低了客户端与子系统之间的耦合性,并提高了系统的模块化和灵活性。然而,使用外观模式时,需要权衡隐藏细节和提供灵活性之间的平衡,避免引入不必要的复杂性。

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

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

相关文章

边缘物联网平台AIoTedge推荐

AIoTedge是一个创新的智能边缘计算平台&#xff0c;它通过边云协同的架构设计&#xff0c;实现了多点部署和分布式计算&#xff0c;提高了数据处理的速度和效率&#xff0c;同时确保了数据的安全性和隐私性。平台具备强大的分布式AIoT处理能力&#xff0c;适用于多种场景&#…

移动端+PC端源码,智慧城管执法系统,后端框架:springboot,移动端:uniapp

市管理综合执法管理平台实现执法办案、业务全流程在线办理&#xff0c;依托移动端PC端的“两端”应用模式&#xff0c;保障能够通过信息化手段进行日常的执法办案工作&#xff0c;强化执法监督功能。提供了案件在线办理、当事人信用管理、文书电子送达、沿街店铺分析等功能&…

2024-如何在低版本Mac OS安装合适的xcode-详细的技术篇

2024-如何在低版本Mac OS安装合适的xcode-详细的技术篇 1. 最烦人的是我不想升降我的macos系统&#xff0c;但是我是一名程序猿我想要玩IOS开发&#xff0c;那就需要下载对应的XCode的编译器。就会出现下面的情况&#xff1f;&#xff1f; 就会出现这样子的情况 原因是我的版…

算法-容斥原理

venn图&#xff1a; 如何求三个圆圈的面积之和&#xff1f; 此时&#xff0c;||不代表绝对值&#xff0c;代表集合的个数 解题思路&#xff1a; 实际上&#xff0c;我们不需要知道每个集合中的元素具体是什么&#xff0c;只需要知道每个集合的大小 例如 &#xff0c;表示10以…

物联网通讯协议MQTT、NB-IOT、Zigbee、CoAP、RFID、BLUETOOTH、NFC、4G和HTTP

物联网协议集 一、按网络四层协议分类 NB-IoT&#xff0c;LORA&#xff0c;WIFI&#xff0c;蓝牙&#xff0c;zigbee&#xff0c;4G都是物理层的&#xff0c;这几个都需要芯片模组支持&#xff08;硬件支持&#xff09; 而MQTT&#xff0c;COAP&#xff0c;HTTP都是应用层协议…

Web入门-05.HTTP协议-响应协议

一.HTTP响应协议的格式 与客户端向服务器发送的HTTP请求(仅指POST请求)格式类似&#xff0c;服务器向客户端发送的HTTP相应格式也分为三类&#xff0c;响应行&#xff0c;响应头和响应体。 HTTP/1.1 200 OK 响应行&#xff1a;响应数据第一行&#xff08;协议、状态码、…

风水学本质上是人机环境系统工效学

风水学与人机环境系统工效学的关系可以这样理解&#xff1a; 风水学源于传统文化&#xff0c;关注如何通过环境布局和方位来促进个人的健康、运势和幸福。它强调环境与个人之间的和谐&#xff0c;试图通过调整环境来提升生活质量。 而人机环境系统工效学则是基于现代科学&#…

面试题每日一练,测测你对JavaScript WeakMap 和数组方法的理解

今天的挑战题目涉及到JavaScript中的 WeakMap、数组方法 map 和 reduce&#xff0c;以及对对象引用的管理。让我们一步步解析这段代码&#xff0c;看看它会输出什么以及为什么。 代码解析 首先&#xff0c;代码创建了一个 WeakMap 实例&#xff1a; const weakMap new WeakMap…

Maven Wrapper深入实战

概述 官网&#xff0c;GitHub。 Maven Wrapper&#xff0c;缩写为mvnw&#xff0c;是一个受Gradle Wrapper和Takari Wrapper启发而产生的Maven子项目&#xff0c;主要有以下三个用途&#xff1a; 让开发者电脑上无需安装Maven&#xff0c;也不用配置环境变量&#xff0c;即可…

Java面试宝典-java基础02

Java面试宝典-java基础02 11、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?12、this 和super 关键字的作用13、在 Java 中,为什么不允许从静态方法中访问非静态变量?14、final 与 static 的区别?15、int可以强制转换为byte吗?16、char 型变量中…

安卓中synchronized 关键字 的作用和介绍

在Java中&#xff0c;synchronized 关键字用于控制多线程环境下对方法或代码块的访问&#xff0c;确保在同一时刻只有一个线程可以执行该方法或代码块。当你在方法声明中使用 synchronized 关键字&#xff0c;这意味着任何线程在调用该方法之前必须获得该方法所属对象的锁。这通…

Android Abort message: ‘Error, cannot access an invalid/free‘d bitmap here!‘

Android Abort message: Error, cannot access an invalid/freed bitmap here! Error, cannot access an invalid/freed bitmap here 在某些Glide加载场景中&#xff0c;如果Glide把Bitmap加载放入到view后&#xff0c;又去从view里面取Bitmap&#xff0c;会抛上述NE错误。 解…

代码随想录 刷题记录-18 动态规划(2)01背包问题、习题

一、01背包理论基础 例题&#xff1a;46. 携带研究材料 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 暴力解法&#xff1a…

大模型实战-FinGLM解析金融财报做RAG经验参考篇

大模型实战-FinGLM金融财报解析实战 https://modelscope.cn/datasets/modelscope/chatglm_llm_fintech_raw_dataset/summary 详细解读&#xff1a; https://modelscope.cn/models/finglm/FinGLM/summary 背景&#xff1a;解读pdf版本的公司财务年报&#xff0c;构建问答模型…

zsh: command not found: brew(M系列芯片)

利用官网的命令安装完brew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"查看版本&#xff0c;提示找不到命令 % brew -v zsh: command not found: brew解决方法&#xff0c;在终端中执行以下命令&#xff0c…

EV代码签名证书——消除软件下载时的安全警告

开发公司和软件开发人员在发布应用程序后&#xff0c;当用户尝试下载并安装应用程序时&#xff0c;被SmartScreen识别为不常见或尚未建立起良好的信誉度&#xff0c;系统就会发出警告&#xff0c;提示用户该应用程序可能对电脑构成风险。这会导致软件下载率大幅度下降。 EV代码…

鸿蒙XComponent组件的认识

概述&#xff1a; XComponent组件作为一种渲染组件&#xff0c;通常用于满足开发者较为复杂的自定义渲染需求&#xff0c;例如相机预览流的显示、游戏画面的渲染、自定义视频播放器等等。其中Native API是其核心内容&#xff01; 其可通过指定其type字段来实现不同的功能&…

Comsol 声学黑洞梁式结构的振动能量收集器

声学黑洞梁式结构是一种用于收集振动能量的装置&#xff0c;其工作原理类似于光学中的黑洞概念。它可以将周围环境中的声波能量转化为可用的电能。声学黑洞梁式结构通常由以下几个主要组成部分构成&#xff1a; 1. 梁&#xff1a;梁是主要的振动结构&#xff0c;可以是金属、陶…

mac nvm安装及使用(nvm安装指定版本node npm pnpm)

mac nvm安装及使用&#xff08;nvm安装指定版本node npm pnpm&#xff09; 1.卸载电脑的node 打开终端&#xff1a;依次执行以下命令&#xff1a; sudo rm -rf /usr/local/bin/npm sudo rm -rf /usr/local/share/man/man1/node.1 sudo rm -rf /usr/local/lib/dtrace/node.d s…

JVM极简教程

基础概念 1.1. Java 虚拟机 是运行 Java字节码的虚拟机 1.2. JVM跨平台原理 JVM在不同的系统&#xff08;Linux、Windows、MacOS&#xff09;上有不同的实现&#xff0c;目的是在使用相同的字节码&#xff0c;它们都会给出相同的结果 JVM跨平台本质&#xff1a;不同操作系统…