Delegate委托模式

委托模式:接受请求的对象将请求委托给另一个对象来处理。

委托模式使得我们可以用聚合来替代继承,它还可以使我们可以模拟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)
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容