Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 有一个代理经理是一个好的设计想法吗?_Android_Oop_Design Patterns - Fatal编程技术网

Android 有一个代理经理是一个好的设计想法吗?

Android 有一个代理经理是一个好的设计想法吗?,android,oop,design-patterns,Android,Oop,Design Patterns,许多Android应用程序都包含自己的BaseActivity类,应用程序中的所有活动都会扩展该类。这是很有用的,因为它为放置大多数/所有活动中通用的功能提供了一个中心位置。拥有BaseActivity的主要缺点是无法使用任何活动子类(ListActivity等) 另一种选择是使用ActivityDelegate。这为功能提供了一个中心位置,同时仍然允许您使用活动子类。它也可以说更易于测试,因为它使用组合而不是继承 当BaseActivity/ActivityDelegate变得太大和复杂时,这

许多Android应用程序都包含自己的BaseActivity类,应用程序中的所有活动都会扩展该类。这是很有用的,因为它为放置大多数/所有活动中通用的功能提供了一个中心位置。拥有BaseActivity的主要缺点是无法使用任何活动子类(ListActivity等)

另一种选择是使用ActivityDelegate。这为功能提供了一个中心位置,同时仍然允许您使用活动子类。它也可以说更易于测试,因为它使用组合而不是继承

当BaseActivity/ActivityDelegate变得太大和复杂时,这两种解决方案都可能导致大量意大利面代码。一个可能的解决方案是使用委托模式,但将功能拆分为许多不同的委托。这减少了代理中的意大利面代码,但随后活动变得更加复杂-他们现在正试图将其on*方法转发给许多不同的代理,而不仅仅是一个

所有这些问题的一个可能解决方案是使用代理管理器。代理管理器跟踪应用程序中所有较小的代理。活动将其on*方法转发给代理管理器,代理管理器将其转发给所有单个代理。这将实现以下所有功能:

  • 重复数据消除代码-所有常用功能都放在其中一个代理中
  • 允许使用活动子类
  • 所有活动中的简单代码-所有on*方法仅转发给一个类
  • 易于测试-很容易模拟单元测试中委托和委托管理器周围的所有内容

以前有人试过使用这种模式吗?如果是这样,情况如何?

据我所知,您指的是整个应用程序的一个DelegateManager对象。如果是这种情况,您可以使用registerActivityLifecycleCallbacks,请参阅

如果您处于
registerActivityLifecycleCallbacks
允许您钩住XXX生命周期方法上的活动

这样做当然有您描述的所有好处:

  • 解耦仅在您实际需要重复行为时才可用,这对于活动工作方式中绑定在一起的控制器+视图逻辑来说是很少见的
  • 如果您有可以重用的活动,那么删除继承是很好的,但我以前从未这样做过。但我想一个很好的用例应该是你处理设置的自制活动,或者类似的需要应用程序范围的L&F&behavior的活动
在我的脑海中,我能想到这些缺点:

  • 到处使用侦听器可能会模糊应用程序活动/调用层次结构的路径,并使代码难以理解。这适用于所有侦听器/分派器类型的编程。这是一个强大的工具,但要小心处理
  • 如果您所做的只是将其传递给生命周期监听器/委托,那么它可能会引入大量(如您所提到的)样板/意大利面代码
  • 您有责任使用
    应用程序从应用程序中注销自己。注销ActivityLifecycleCallbacks
    。我觉得没什么好办法
就我个人而言,我在生命周期中很少使用这种设计模式,但对于某些用例来说,它可能是值得的。例如:

  • ApplicationLifecycleLogger:每次创建/恢复/暂停。。。作为一个活动,您可以使用logcat或其他使调试生命周期更容易的工具
  • 例如,如果某人由于某种模型状态(例如,响铃警报->无法进入AlarmEditActivity)而进入了他/她不允许进入的活动,您可以在那里执行finish()
  • 在活动边界上传递对象状态,而无需包裹:和屏幕旋转更改。通常,这是通过应用程序中的映射或某个静态字段实现的。您可以通过让授权者保持状态来实现这一点
另外,请看:


我希望这是有帮助的=)

谢谢你的回复。我对这种模式的主要需求之一是在网络无法加载时显示“网络错误”屏幕。我在活动和片段中都做网络工作,所以我需要为两者显示相同的屏幕。有了一个代理,我能够将显示网络错误的所有代码放在一个地方;如果我要使用继承,我需要一个BaseActivity,然后我假设还有一个BaseFragment,两者都包含非常相似的代码。您是否遇到过这个用例?如果是这样的话,您是否能够在不复制代码的情况下通过继承来处理它?我为这个迟来的回复道歉。“网络错误”似乎是一个合法的用例——它有点类似于“ApplicationLifecycleLogger”,因为它的使用在基于网络的应用程序的大多数活动中都是有动机的。就我个人而言,我还没有写过这样的应用程序,所以我还没有遇到过它。