Delegate委托模式

委托模式:接受請求的對象將請求委托給另一個對象來處理。

委托模式使得我們可以用聚合來替代繼承,它還可以使我們可以模擬mixin(Mixin是面向對象程序設計語言中的類,提供了方法的實現。其他類訪問mixin類的方法而不必成為其父類。)

通常來講,委托模式需要三個因素: 事件,事件接受者,被委托者。

委托模式,能幫助我們將具體的實現細節(jié)隱藏。
如Android中日期選擇組件,DatePicker專注實現UI細節(jié),而用戶選擇返回等一些事情委托為DatePickerDelegate去實現。

public class DatePicker extends FrameLayout {

    private final DatePickerDelegate mDelegate;
    public DatePicker(...) {
       mDelegate = createSpinnerUIDelegate(...);
    }

    private DatePickerDelegate createSpinnerUIDelegate(...) {
        return new DatePickerSpinnerDelegate(...);
    }
    interface DatePickerDelegate {
        int getYear();
        int getMonth();
        int getDayOfMonth();
    }
    abstract static class AbstractDatePickerDelegate implements DatePickerDelegate {
        // The delegator
        protected DatePicker mDelegator;
    }
}

上面這種,我們通過接口去定義委托的事情,被委托者去實現接口方法,委托人直接調用被委托者的實現就好。
當然我們也可以直接委托方法。如前面的拍照代碼封裝中,直接將onActivityResult里需要處理的事情委托給委托者去實現,最終調用委托人的實現即可。

class Activity : ToolbarActivity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
      imagePickerDelegate = ImagePickerActivityDelegate(this)
    }
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        imagePickerDelegate?.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        imagePickerDelegate?.onActivityResult(requestCode,resultCode,data)
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容