委托模式:接受请求的对象将请求委托给另一个对象来处理。
委托模式使得我们可以用聚合来替代继承,它还可以使我们可以模拟mixin(Mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类访问mixin类的方法而不必成为其父类。)
通常来讲,委托模式需要三个因素: 事件,事件接受者,被委托者。
委托模式,能帮助我们将具体的实现细节隐藏。
如Android中日期选择组件,DatePicker
专注实现UI细节,而用户选择返回等一些事情委托为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)
}
}