委托模式:接受請求的對象將請求委托給另一個對象來處理。
委托模式使得我們可以用聚合來替代繼承,它還可以使我們可以模擬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)
}
}