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

server/2024/10/22 15:39:47/

前言


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

在这里插入图片描述


实现


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

1、用户验证(UserAuthentication)

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

kotlin">
/*** 用户认证*/
class UserAuthentication {fun validateUser(userId: String, password: String): Boolean {println("System Validating user...")return userId == "Ho" && password == "123456"}
}

2、账户管理 (AccountManager)*

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

kotlin">
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)

负责执行交易的子系统

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

4、通知服务 (NotificationService)

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

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

5、外观类

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

kotlin">
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.")}}

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

kotlin">// 创建子系统对象
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()等,让开发者无需关心底层复杂的实现。

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

2、摄像头CameraX

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

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

kotlin">
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_CAMERAcameraProvider.bindToLifecycle(this, cameraSelector, preview)
}, ContextCompat.getMainExecutor(this))

3、连接管理类ConnectivityManager

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

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

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

总结

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


http://www.ppmy.cn/server/112011.html

相关文章

Transiting from CUDA to HIP(三)

一、Workarounds 1. memcpyToSymbol 在 HIP (Heterogeneous-compute Interface for Portability) 中&#xff0c;hipMemcpyToSymbol 函数用于将数据从主机内存复制到设备上的全局内存或常量内存中&#xff0c;这样可以在设备端的内核中访问这些数据。这个功能特别有用&#x…

Leetcode3254. 长度为 K 的子数组的能量值 I

Every day a Leetcode 题目来源&#xff1a;3254. 长度为 K 的子数组的能量值 I 解法1&#xff1a;暴力 遍历数组 nums 中的每个长度为 k 的子数组&#xff0c;判断子数组中的所有相邻元素是否满足后一个元素与前一个元素之差等于 1&#xff0c;如果满足则子数组的能量值等于…

前端:HTML、CSS、JS、Vue

1 前端 内容概要 了解前端三件套(HTML、CSS、JS)在前端所起的作用掌握HTML标签的功能&#xff0c;掌握重要标签(a标签&#xff0c;form标签)了解CSS了解JS的基础语法掌握Vue的基础语法重点掌握Vue项目怎么启动项目掌握前后端分离是什么。前端做什么事情&#xff0c;后端做什么…

探索未知,悦享惊喜 —— 您的专属盲盒小程序,即将开启奇妙之旅

在这个充满无限可能的数字时代&#xff0c;每一次点击都可能是通往惊喜的门户。我们匠心打造的“惊喜盲盒”小程序&#xff0c;正是为了给您带来前所未有的娱乐体验与心灵触动。在这里&#xff0c;每一份盲盒都蕴藏着精心挑选的宝藏&#xff0c;等待着与您的不期而遇。 【探索…

Transforms使用

文章目录 一、认识Transforms二、ToTensor方法使用三、展示图片的方法 一、认识Transforms transforms 是 torchvision 库中的一个模块&#xff0c;它提供了一系列的图像预处理功能。这些功能可以被用来对图像数据进行变换&#xff0c;以便它们能够被神经网络模型更好地处理。…

论文速读|快速且稳健的人形机器人轨迹优化

论文地址&#xff1a;https://arxiv.org/pdf/2409.00303 这篇论文提出了一种新颖的全尺寸人形机器人轨迹优化算法&#xff0c;能够在几秒钟内生成的可行步态。该方法在能效和实现期望行为方面优于现有的最先进规划器。未来工作将涉及将优化后的轨迹转移到真实世界硬件上。 论文…

Java项目怎么从零部署到Linux服务器上?

目录 一.Java环境&#xff08;JDK&#xff09;安装 二.数据库&#xff08;MySQL&#xff09;安装 三.部署上线 ▐ 部署Jar包 ▐ 运行程序 ▐ 开放端口 一个Java项目首先需要一个支持它编译的Java环境&#xff0c;因此首先要保证服务器上安装的有相应的JDK 一.Java环境&a…

线性代数基础

向量的点积 点乘和叉乘 矩阵乘法 规则&#xff1a; 1&#xff0c;两个矩阵相乘时&#xff0c;第一个矩阵的列数必须等于第二个矩阵的行数 矩阵乘法是点乘还是叉乘 矩阵点乘&#xff1a;是矩阵各个对应元素相乘, 这个时候要求两个矩阵必须同样大小。矩阵叉乘&#xff1a;矩…