专业的编程技术博客社区

网站首页 > 博客文章 正文

为什么你的“BaseActivity”是反模式——Kotlin 委托

baijin 2024-09-10 10:59:47 博客文章 6 ℃ 0 评论

我们可以经常看到有名为“BaseActivity”或“BaseFragment”等的类。其主要论点是他们有时需要覆盖其所有活动类中的某些行为,而继承似乎是一个不错的选择。

但是,使用继承的问题是什么?为什么它是反模式?

首先,“BaseFragment, BaseActivity, BaseX”命名模式完全是反模式。名称应明确说明其职责。

开发者无法正确命名这些父类,原因是他们需要一个具有多重职责的单一父类。

例如,假设需要离开屏幕时记录一次日志,并在返回时再次记录一次,并希望在所有活动中执行此过程。最常见的方法是有一个父活动,例如将其命名为“AnalyticsActivity”。

接下来,假设有来自某处的输入数据,并且需要在某些或所有活动中覆盖“onNewIntent”。我们称之为“IntentHandlerActivity”。

如你所见,现在有两个父活动类,一个是“AnalyticsActivity”,一个是“IntentHandlerActivity”。

许多开发人员会创建一个单一的“BaseActivity”并在其中实现所有这些不同的职责。这完全是反模式。

Kotlin 委托 (Delegations)

委托是一种常见的编程模式。优势在于Kotlin本身支持委托。这是一个强大的特性,可以将功能从一个对象委托给另一个对象。它允许你以灵活且简洁的方式重用代码和组合对象。

接口

Kotlin中的委托通常用于接口。可以将接口的实现委托给另一个对象,而不是在一个类中实现所有方法。

被委托属性

Kotlin还支持属性的委托。可以使用被委托的属性定义属性访问和修改,而无需明确实现getter和setter方法。

如果你看到“by lazy”或“by viewModels()”之类的代码,你很可能已经了解了这种方法的强大之处。

如何用Kotlin委托解决我们的问题

接口:

interface AnalyticsLogger {
    fun registerLifecycleOwner(owner: LifecycleOwner)
}

实现类还应该实现LifecycleEventObserver,这样才能观察注册的生命周期拥有者的状态变化。

class AnalyticsLoggerImpl : AnalyticsLogger, LifecycleEventObserver {
    override fun registerLifecycleOwner(owner: LifecycleOwner) {
        owner.lifecycle.addObserver(this)
    }
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            Lifecycle.Event.ON_START -> println("User opened the screen.")
            Lifecycle.Event.ON_PAUSE -> println("User leaved the screen.")
            else -> Unit
        }
    }
}

们如何在Activity中实现它:

class MainActivity : ComponentActivity(), AnalyticsLogger by AnalyticsLoggerImpl() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        registerLifecycleOwner(this)
    }
}

没有扩展任何父类,也没有继承任何东西,使用了一个实现,并将工作委托给其相应的委托,在例子中是“AnalyticsLoggerImpl”,并且只调用了一行代码。

现在,在任何有生命周期的类中使用这个委托时,将能够记录事件,而不需要一个具有多种不同职责的父Activity类。

再创建一个委托来处理新的 intent:

interface DeepLinkHandler {
    fun handleDeepLink(activity: Activity, intent: Intent?)
}
class DeepLinkHandlerImpl: DeepLinkHandler {
    override fun handleDeepLink(activity: Activity, intent: Intent?) {
        // 处理intent
    }
}

在的Activity中实现它:

class MainActivity : ComponentActivity(),
    AnalyticsLogger by AnalyticsLoggerImpl(),
    DeepLinkHandler by DeepLinkHandlerImpl() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        registerLifecycleOwner(this)
    }
    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        handleDeepLink(this, intent)
    }
}

正如你所知,一个类只能继承一次。但是,可以随意实现任意数量的类。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表