Head First 设计模式 13-代理模式
代理模式 为一个对象提供一个替身或占位符以控制对这个对象的访问。
书中以 Java RMI (Remote Method Invocation 远程方法调用)为例介绍的。
大概的实现步骤如下:
- 将远程接口的实现注册到 RMI registry 。
- 客户端从 RMI registry 查找并获取 stub(存根)。
- 客户像调用本地服务一样调用 stub 的方法。
RMI 的项目没有接触过,现在用的比较多的是 Spring Cloud 。其模式也是类似的,不过功能更加强大和实用,如常用的重试、熔断、负载均衡等,实现起来也比较简单。
另外 Spring Cloude 默认使用的是 HTTP 协议,效率上可能会比 RMI 的方式要低,不过还是可以整合 Thrift RPC 等协议的。
.NET 中对应的有 WCF ,不过没有 RMI registry 类似的概念。另外 .NET Core 也支持 gRPC 了。
WCF 的实现方法也比较简单:
- 创建 WCF 服务应用程序 项目,添加 WCF 服务,完成后启动项目(后面添加 服务引用 时会访问服务的地址)。
- 在客户端项目中添加 服务引用,添加后会自动在 Connected Services 下生成对应的接口和实现类。
- 在客户端项目直接实例化实现类,像调用本地服务一样使用。
该章节另外还介绍了两个代理模式的变体:虚拟代理 和 保护代理 。
- 虚拟代理 通常用来隐藏创建开销大的对象,通过代理只在必要的时候才创建真正的对象。
- 保护代理 则是通过在对象外包装一层代理来保护对象方法的访问。这里用到了 Java 中的 Proxy.newProxyInstance() 方法和 InvocationHandler 接口,C# 中好像没有现成的类或接口,不过使用反射应该也能实现类似的功能。