Android 有一个代理经理是一个好的设计想法吗?
许多Android应用程序都包含自己的BaseActivity类,应用程序中的所有活动都会扩展该类。这是很有用的,因为它为放置大多数/所有活动中通用的功能提供了一个中心位置。拥有BaseActivity的主要缺点是无法使用任何活动子类(ListActivity等) 另一种选择是使用ActivityDelegate。这为功能提供了一个中心位置,同时仍然允许您使用活动子类。它也可以说更易于测试,因为它使用组合而不是继承 当BaseActivity/ActivityDelegate变得太大和复杂时,这两种解决方案都可能导致大量意大利面代码。一个可能的解决方案是使用委托模式,但将功能拆分为许多不同的委托。这减少了代理中的意大利面代码,但随后活动变得更加复杂-他们现在正试图将其on*方法转发给许多不同的代理,而不仅仅是一个 所有这些问题的一个可能解决方案是使用代理管理器。代理管理器跟踪应用程序中所有较小的代理。活动将其on*方法转发给代理管理器,代理管理器将其转发给所有单个代理。这将实现以下所有功能:Android 有一个代理经理是一个好的设计想法吗?,android,oop,design-patterns,Android,Oop,Design Patterns,许多Android应用程序都包含自己的BaseActivity类,应用程序中的所有活动都会扩展该类。这是很有用的,因为它为放置大多数/所有活动中通用的功能提供了一个中心位置。拥有BaseActivity的主要缺点是无法使用任何活动子类(ListActivity等) 另一种选择是使用ActivityDelegate。这为功能提供了一个中心位置,同时仍然允许您使用活动子类。它也可以说更易于测试,因为它使用组合而不是继承 当BaseActivity/ActivityDelegate变得太大和复杂时,这
- 重复数据消除代码-所有常用功能都放在其中一个代理中
- 允许使用活动子类
- 所有活动中的简单代码-所有on*方法仅转发给一个类
- 易于测试-很容易模拟单元测试中委托和委托管理器周围的所有内容
以前有人试过使用这种模式吗?如果是这样,情况如何?据我所知,您指的是整个应用程序的一个DelegateManager对象。如果是这种情况,您可以使用registerActivityLifecycleCallbacks,请参阅 如果您处于
registerActivityLifecycleCallbacks
允许您钩住XXX生命周期方法上的活动
这样做当然有您描述的所有好处:
- 解耦仅在您实际需要重复行为时才可用,这对于活动工作方式中绑定在一起的控制器+视图逻辑来说是很少见的
- 如果您有可以重用的活动,那么删除继承是很好的,但我以前从未这样做过。但我想一个很好的用例应该是你处理设置的自制活动,或者类似的需要应用程序范围的L&F&behavior的活动
- 到处使用侦听器可能会模糊应用程序活动/调用层次结构的路径,并使代码难以理解。这适用于所有侦听器/分派器类型的编程。这是一个强大的工具,但要小心处理
- 如果您所做的只是将其传递给生命周期监听器/委托,那么它可能会引入大量(如您所提到的)样板/意大利面代码
- 您有责任使用
。我觉得没什么好办法应用程序从应用程序中注销自己。注销ActivityLifecycleCallbacks
- ApplicationLifecycleLogger:每次创建/恢复/暂停。。。作为一个活动,您可以使用logcat或其他使调试生命周期更容易的工具
- 例如,如果某人由于某种模型状态(例如,响铃警报->无法进入AlarmEditActivity)而进入了他/她不允许进入的活动,您可以在那里执行finish()
- 在活动边界上传递对象状态,而无需包裹:和屏幕旋转更改。通常,这是通过应用程序中的映射或某个静态字段实现的。您可以通过让授权者保持状态来实现这一点
我希望这是有帮助的=)谢谢你的回复。我对这种模式的主要需求之一是在网络无法加载时显示“网络错误”屏幕。我在活动和片段中都做网络工作,所以我需要为两者显示相同的屏幕。有了一个代理,我能够将显示网络错误的所有代码放在一个地方;如果我要使用继承,我需要一个BaseActivity,然后我假设还有一个BaseFragment,两者都包含非常相似的代码。您是否遇到过这个用例?如果是这样的话,您是否能够在不复制代码的情况下通过继承来处理它?我为这个迟来的回复道歉。“网络错误”似乎是一个合法的用例——它有点类似于“ApplicationLifecycleLogger”,因为它的使用在基于网络的应用程序的大多数活动中都是有动机的。就我个人而言,我还没有写过这样的应用程序,所以我还没有遇到过它。