我有一个 Activity
, a Presenter
和a Contract
其中 Activity
和 Presenter
实施。该。Activity
将会有一些独特的用户界面的东西,这些东西必须在 Presenter
. 该 Presenter
还必须能够对Activity进行调用(如 sendBroadcast()
),这就利用了一个 Activity
也是 Context
.
我的难题是:如果我通过... Context
至 Presenter
我失去了对用户界面方法的访问权,而这些方法是在 Activity
; 如果我通过 Contract.View
至 Presenter
,我失去了对那些需要 Context
. 我能想到的解决办法只有
A)通过这两项考试 Context
以及 Contract.View
至 Presenter
始终是同一个对象,即 Activity
)或
B) 抛弃 按合同设计 模式,直接将 Activity
至 Presenter
这两种方法似乎都是馊主意......这里有什么推荐的方法?下面是我目前正在使用的代码的缩小版。
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
}
}
// 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...)
// ...
}
}
interface Contract {
interface View {
updateText(text: String)
}
interface Presenter {
setServiceCommInfo()
}
}
A. 把两者都传给presenter。我发现它更干净,更SOLID.但说实话,我用的只是标签中的java.希望是什么东西!
我想出了一个比我在原帖中提到的两个解决方案 "不那么丑"(丑是一个非常主观的术语)。基本上,这里的想法是确定
mContext
和 Contract.View
始终是同一个对象将以下代码添加到 Presenter.kt 将使其不必两次传递同一个对象。
class Presenter(private val mContext: Context): Contract.Presenter {
private lateinit var mView: Contract.View
init {
if (mContext is Contract.View) mView = mContext
}
}