设计困境--上下文还是合同?(JavaKotlin)

问题描述 投票:0回答:1

我有一个 Activity, a Presenter和a Contract 其中 ActivityPresenter 实施。该。Activity 将会有一些独特的用户界面的东西,这些东西必须在 Presenter. 该 Presenter 还必须能够对Activity进行调用(如 sendBroadcast()),这就利用了一个 Activity 也是 Context.

我的难题是:如果我通过... ContextPresenter我失去了对用户界面方法的访问权,而这些方法是在 Activity; 如果我通过 Contract.ViewPresenter,我失去了对那些需要 Context. 我能想到的解决办法只有

A)通过这两项考试 Context 以及 Contract.ViewPresenter 始终是同一个对象,即 Activity)或

B) 抛弃 按合同设计 模式,直接将 ActivityPresenter


这两种方法似乎都是馊主意......这里有什么推荐的方法?下面是我目前正在使用的代码的缩小版。

Activity. kt

class Activity: AppCompatActivity(), Contract.View {

    private lateinit var mPresenter: Contract.Presenter

    @BindView(R.id.textView)
    private lateinit var mTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        // ...
        mPresenter = Presenter(this)
    }

    override fun updateText(text: String) {
        mTextView.text = text
    }

}

主持人.kt

// Pass Context or Contract.View as parameter to constructor?
class Presenter(private val ???: ???): Contract.Presenter {

    fun discoverService() {
        val intent: Intent = // ...

        mContext.sendBroadcast(intent)
    }

    override fun setServiceCommInfo() {
        mView.updateText(Acquiring Data from Service...)
        // ...
    }

}

合同.kt

interface Contract {

    interface View {
        updateText(text: String)
    }

    interface Presenter {
        setServiceCommInfo()
    }

}
java kotlin android-context design-by-contract
1个回答
0
投票

A. 把两者都传给presenter。我发现它更干净,更SOLID.但说实话,我用的只是标签中的java.希望是什么东西!


0
投票

我想出了一个比我在原帖中提到的两个解决方案 "不那么丑"(丑是一个非常主观的术语)。基本上,这里的想法是确定

  1. mContextContract.View 始终是同一个对象
  2. 如果一个对象O实现了I,则认为它是接口I的一个实例。

将以下代码添加到 Presenter.kt 将使其不必两次传递同一个对象。

class Presenter(private val mContext: Context): Contract.Presenter {

    private lateinit var mView: Contract.View

    init {
        if (mContext is Contract.View) mView = mContext
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.