Kotlin~Mediator中介者模式

概念

创建一个中介来降低对象之间的耦合度,关系"多对多"变为"一对多"。

角色介绍

  • Mediator:抽象中介者,接口或者抽象类。
  • ConcreteMediator:中介者具体实现,实现中介者接口,定义一个List管理Colleague对象。
  • Colleague:抽象同事,定义同事类的接口或者抽象类,保存中介者对象,实现同事类通用的方法。
  • ConcreteColleague:具体同事类,实现抽象同事类。通过中介者间接完成具体同事类之间的通信。

UML

代码实现

kt 复制代码
interface UserAbs {
    fun enter(chatRoom: ChatRoom)
    fun send(msg: String)
    fun receive()
}

data class User(val name: String) : UserAbs {
    private var room: ChatRoom? = null

    override fun enter(chatRoom: ChatRoom) {
        room = chatRoom
        room?.enter(this)
    }

    override fun send(msg: String) {
        room?.operation(this, msg)
    }

    override fun receive() {
        room?.getMessage()?.forEach {
            println(it)
        }
    }
}
class ChatRoom(val id: Int) {
    private val messages = ArrayList<String>()

    fun enter(user: User) {
        println("${user.name}进入聊天室$id")
    }

    fun operation(user: User, msg: String) {
        val log = "${user.name}说了$msg"
        println(log)
        messages.add(log)
    }

    fun getMessage(): MutableList<String> {
        return messages
    }
}

fun main() {
    val room = ChatRoom(1)
    val user1 = User("张三")
    val user2 = User("李四")
    val user3 = User("王八")
    user1.enter(room)
    user2.enter(room)
    user3.enter(room)
    user1.send("你好")
}

优缺点

优点

  • 简化对象间的关系
  • 提高灵活性
  • 促进低耦合

缺点

  • 中介者过于庞大

应用场景

适用于复杂通信对象组,重用对象。

  1. 聊天应用,聊天室
  2. 空中交通控制系统
  3. GUI框架,MVC架构 Controller是中介者,根据View的请求Model
  4. 工作流引擎,协调用户界面、事件之间的关系

总结

中介者模式核心在于引入中介者类,承担中转和协调作用。MediatorLiveData就是使用了中介者模式,可用来管理、合并多个数据源。它的源码可以参考:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYivHGrz-1691306533508)(https://juejin.cn/post/7054720521031647245)]

参考:

相关推荐
低调小一28 分钟前
Swift 语法学习指南 - 与 Kotlin 对比
微信·kotlin·swift
叽哥6 小时前
Kotlin学习第 3 课:Kotlin 流程控制:掌握逻辑分支与循环的艺术
android·java·kotlin
用户097 小时前
Gradle 现代化任务依赖方案
android·kotlin
前行的小黑炭19 小时前
Android 协程的使用:结合一个环境噪音检查功能的例子来玩玩
android·java·kotlin
Android-Flutter1 天前
kotlin - 平板分屏,左右拖动,2个Activity计算宽度,使用ActivityOptions、Rect(三)
android·kotlin
前行的小黑炭2 天前
Android :为APK注入“脂肪”,论Android垃圾代码在安全加固中的作用
android·kotlin
tangweiguo030519872 天前
Android Kotlin 动态注册 Broadcast 的完整封装方案
android·kotlin
前行的小黑炭2 天前
Android 不同构建模式下使用不同类的例子:如何在debug模式和release模式,让其使用不同的类呢?
android·kotlin·gradle
Android-Flutter2 天前
kotlin - 2个Fragment实现左右显示,左边列表,右边详情,平板横、竖屏切换
android·kotlin
木头左3 天前
结合机器学习的Backtrader跨市场交易策略研究
人工智能·机器学习·kotlin