我在阿里巴巴工作期间,曾经负责开发一个统一缓存服务。这个服务要求能够根据远程配置中心的配置信息,在运行期动态更改缓存的配置,可能是将本地缓存更改为远程缓存,也可能是更改远程缓存服务器集群的 IP 地址列表,进而改变应用程序使用的缓存服务。
这就要求缓存服务的客户端 SDK 必须支持运行期配置更新,而配置更新又会直接影响缓存数据的操作,于是就设计出这样一个缓存服务 Client 类。
这个缓存服务 Client 类的方法主要包含两个部分:一部分是缓存服务方法,get()、put()、delete() 这些,这些方法是面向调用者的;另一部分是配置更新方法 reBuild(),这个方法主要是给远程配置中心调用的。
但是问题是,Cache 类的调用者如果看到 reBuild() 方法,并错误地调用了该方法,就可能导致 Cache 连接被错误重置,导致无法正常使用 Cache 服务。所以必须要将 reBuild() 方法向缓存服务的调用者隐藏,而只对远程配置中心的本地代理开放这个方法。
但是 reBuild() 方法是一个 public 方法,如何对类的调用者隐藏类的公有方法?
接口隔离原则
我们可以使用接口隔离原则解决这个问题。接口隔离原则说:不应该强迫用户依赖他们不需要的方法。