背景
在项目中,经常会抽离各种基类,要使用的时候,直接继承即可;
比较常见的,如BaseWebActivity,BaseTitleBarActivity、BaseListViewActivity、BaseVideoActivity
- BaseWebActivity
带有webview功能,子类只需要传入url即可;
- BaseTitleBarActivity
带有头部titleBar功能,子类可自定义传入title(顶部文案)、menu(右侧文案)...
- BaseListViewActivity
带有listView列表功能,同时支持下拉刷新、上拉加载更多功能;
- BaseVideoActivity
带有阿里云播放器功能,对阿里云播放进行初始化;
痛点
单一功能的基类确实能满足绝大部分的需求,但由于使用方式是继承,这就导致了无法进行功能组合。
如某个页面需要listview、video的功能,由于java里面只支持单继承,无法满足同时继承两个基类,这就需要额外的开发工作;
方案
将基类改造为接口,使用实现的方式来接入,这样由于java里面是支持多实现,这样就可以对各种基础功能进行组合使用,保证了功能的职责单一性,同时也满足了高内聚低耦合的设计思路。
BaseWebActivity -> IWebViewHelper
/**
* 基于BaseWebActivity,改造为IWebViewHelper
**/
class IWebViewHelper{
fun binding(fragment: Fragment, observer: IWebViewObserver) {
// 初始化代码
...
}
fun binding(activity: Activity, observer: IWebViewObserver) {
// 初始化代码
...
}
fun unBinding() {
// 解绑 防止内存泄漏
...
}
interface IWebViewObserver {
fun getWebView(): WebView
fun getWebViewUrl(): String
fun isOverrideUrlLoading(view: WebView?, url: String?): Boolean = false
fun needLoadNow(): Boolean = true
fun getTitleTextView(): TextView?
}
}
// 使用
val helper = IWebViewHelper()
helper.binding()
helper.unBinding()
BaseListViewActivity -> IBaseListHelper
class IBaseListHelper<T, K : BaseViewHolder> : BaseQuickAdapter.RequestLoadMoreListener,
SwipeRefreshLayout.OnRefreshListener {
fun binding(fragment: Fragment, observer: IBaseListObserver<T, K>) {
// 初始化代码
...
}
fun binding(content: Activity, observer: IBaseListObserver<T, K>) {
// 初始化代码
...
}
fun unBinding() {
// 解绑 防止内存泄漏
...
}
interface IBaseListObserver<T, K : BaseViewHolder> {
fun getRecyclerView(): RecyclerView?
fun getSwipeRefreshLayout(): SwipeRefreshLayout?
fun getEmptyView(): View?
fun getAdapter(): BaseQuickAdapter<T, K>
fun getLayoutManager(): RecyclerView.LayoutManager
fun hasLoadMore(): Boolean = true
fun goneLoadMoreView(): Boolean = false
fun getPageSize(): Int = 20
fun autoRefresh(): Boolean = true
fun loadData(pageNo: Int, pageSize: Int): Observable<List<T>>
}
}
BaseDialogActivity -> IDialogHelper
class IDialogHelper {
fun attach(activity: Activity, observer: IDialogObserver) {
// 初始化代码
...
}
fun attach(dialog: Dialog, observer: IDialogObserver) {
// 初始化代码
...
}
interface IDialogObserver {
fun getWidthRatio(): Float = 1f
fun getHeightRatio(): Float = 0.65f
}
}
BaseVideoActivity -> IVideoPlayerHelper
class IVideoPlayerHelper : LifecycleEventObserver, DLNADeviceConnectListener {
fun binding(fragment: Fragment, observer: IBaseListObserver<T, K>) {
// 初始化代码
...
}
fun binding(content: Activity, observer: IBaseListObserver<T, K>) {
// 初始化代码
...
}
fun unBinding() {
// 解绑 防止内存泄漏
...
}
interface IVideoPlayerObserver {
fun getVideoPlayerView(): AliyunVodPlayerView?
// 屏幕旋转
fun onScreenModeChanged(mode: AliyunScreenMode)
fun isResumeAutoPlay(): Boolean = true
}
}