代理模式
代理模式是一种结构型设计模式, 让你能提供真实服务对象的替代品给客户端使用。 代理接收客户端的请求并进行一些处理 (访问控制和缓存等), 然后再将请求传递给服务对象。
问题
当我们的系统过有一些对象是非常缓慢和影响性能的,它可能持有了大量的系统资源或者运行在远端(服务器、其它应用)。我们需要操作它们但并不是总是需要,系统的多个地方可能都会有操作它们的需要,这会对性能造成很大的影响。
Android/Java/Other
简单工厂模式 描述了一个类, 它拥有一个包含大量条件语句的构建方法, 可根据方法的参数来选择对何种产品进行初始化并将其返回。它并不是《Design Patterns - Elements of Reusable Object-Oriented Software》(通用的设计模式参考书)所推荐的23种设计模式的其中之一。更像是一种书写代码的风格和习惯。下面给出代码示例
1 | public class WeaponFactory { |
这两天正好遇到这样一个问题,公司项目在引入新的aar库时出现了下面这个错误。除此之外还有一个AndroidManifest.xml文件merge error。
1 | Duplicate class android.support.v4.app.INotificationSideChannel$Stub found in modules classes.jar |
在网上查了下资料,大概了解是因为新引入的包使用的android.support包,而我们的项目工程已经整体迁移到androidx,这两个库在功能上是重叠的,所以导致了上述的报错。
针对这种情况android官方提供了一种方式。在项目根目录下的gradle.properties文件中加入这两行。
1 | android.useAndroidX=true//是否使用androidx |
加入这两行后可以解决大部分上述问题。
但是公司项目在此次引入库(称做B.aar,B.aar使用了普通的android.support)之前是将”android.enableJetifier”开关注释了,原因是项目中原本使用的一个第三方库,这个库对android.support库做了定制(称做A.aar,A.aar使用了自己定制的android.support)。如果使用了“android.enableJetifier”开关,会改变所有“android.support.XX”包名为”androidx.XX”,这会导致A.aar的功能不可用。
由此出现一种局面就是:1.如果我们将“android.enableJetifier”置为true会因为改变了定制过的android.support库而使A.aar不可用;2.如果我们将“android.enableJetifier”置为false会因为项目项目本身使用的androidX和B.aar当中的普通android.support产生support库的冲突。
我们希望能够将B.aar当中的普通android.support强制转换为androidx,却又不想A.aar当中的定制android.support库被强转为androidx,经过多方了解和尝试我们找到Android官网没有写明的一个配置项,可以忽略某个包下面的强转,如下所示:
1 | android.useAndroidX=true//是否使用androidx |
这样就完美解决了这个问题。