java - 设计困境——背景还是契约?(Java/科特林)
问题描述
我有 a Activity
、 aPresenter
和 a Contract
,它们都是 theActivity
和Presenter
工具。将Activity
有一些独特的 UI 内容,必须从Presenter
. Presenter
还必须能够调用 Activity(例如),它利用了 an也是 a的sendBroadcast()
事实。Activity
Context
这是我的难题:如果我传递Context
给,我将无法访问;Presenter
独有的 UI 方法。Activity
如果我将 传递Contract.View
给Presenter
,我将无法访问需要Context
. 我能想到的唯一解决方案是:
A)将Context
AND都传递Contract.View
给Presenter
(始终是相同的对象,即Activity
)或
B) 完全抛弃Design-by-Contract模式,直接Activity
将Presenter
两者似乎都是坏主意……这里推荐的方法是什么?下面是我目前正在使用的代码的缩小版本:
活动.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()
}
}
解决方案
我想出了一个比我在原始帖子中提到的两个“不那么丑”(丑是一个非常主观的术语)的解决方案。基本上这里的想法是确定
mContext
并且Contract.View
永远是同一个对象- 如果 O 实现了 I,则对象 O 被认为是接口 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
}
}
推荐阅读
- javascript - 如何使用 Javascript 检测用户在我的网站中的首次访问?
- javascript - 在反应生产构建中删除控制台日志语句?
- angular - 等待两种以角度返回可观察对象的方法
- react-native - 无法读取属性导航未定义
- java - 如何从 android studio 中的片段打开对话框?
- java - 始终等待页面加载到 PageObjects
- nuxt.js - 如何使 autoprefixer 与 Nuxt 项目中的 .vue 文件一起使用?
- python - 为什么seaborn在相同的情节中选择不同的颜色?
- excel - 我的数据透视表不尊重我的组的顺序
- javascript - 如何使用 props 更改 react 组件 iframe 中的 URL