主要围绕单例模式,但是还是有独到的东西
public class ServiceManager {
private static Map<String, Object> serviceSingletonMap = new HashMap<>();
public static void registerService(String serviceName, Object serviceSingleton) {
serviceSingletonMap.put(serviceName,serviceSingleton);
}
//unregister...
//getService...
}
上篇读书笔记围绕NetworkService.sendRequest(Request);来展开,其实这不是最优实现,用一个单例管理中心是最好的实现。
ServiceManager.getService("网络请求");
在原来调用服务的时候,是点对点的耦合,现在只需要耦合服务中心,服务中心来耦合所有的服务,也就是说在使用者和服务之间增加了一个服务代理,进一步解决了耦合程度。在Android中,Context就是利用的这种模式,注册了服务,开发者也可以很方便地获取服务。(伪解耦)
更优一点是这样的,ServiceManager.execServiceMethod("网络请求","sendRequest",Request);这样可以说可以送佛送到西了,根据第一章读书笔记里的迪米特原则,了解的越少越好,现在我对NerworkManager都一无所知了,原来获取服务后还要转型成NetworkService,属于伪解耦,现在这样,是真解耦。这也是一种依赖注入原则的体现,面向了接口,也就是抽象。更是 里氏替换原则的体现。
但是这样高度解耦也带来了隐患。这个方法的实现形式1是ServiceManager更深入地耦合所有的工具类,这倒无所谓,但是假如有1000个框架,10000个方法在这里注册呢,这意味着ServiceManager这个类的体积会很大,工作量大一点倒也没事,但是这么多代码在程序中占领的内存是恐怖的。实现形式2是反射,这带来了一定的性能隐患,但是只需要做好cache,method.invoke和直接调用的性能相差可以说是非常之小了,但是带来的解耦程度是惊人的。
最后ServiceManager就不需要也隐式处理了,但是可以声明接口,进行接口隔离。