代理模式-开源代码实例

1,开源代码实例
HttpResponseProxy


![]()

2,开源实践




3,总结

HttpClient想实现的功能:返回HttpResponse,释放http连接;
3-1,为什么通过response释放http连接?

可能你会想到通过httpclient或者httprequest释放http连接:

这样是不行的,因为一个httpclient一个httprequest可以建立多个http连接:

所以将释放http连接的动作放到response中是一件水到渠成的事。
3-2,为什么不使用包装器模式?
因为从类的名称(HttpResponseProxy)上看代理的是HttpResponse,其实代理的是ConnectionHolder。
ConnectionHolder有很多方法,而其代理了close方法。
所以从ConnectionHolder的角度看不适合用包装器模式。
以另外一个例子可做证明:

通过以上例子也可以看出,ResponseEntityProxy代理的并非entity,而是ConnectionHolder,所以从ConnectionHolder的角度看不适合用包装器模式,而是用代理模式。
综上所述,HttpResponseProxy和ResponseEntityProxy包装了HttpResponse和ResponseEntity,代理了ConnectionHolder;
包装的程度比较轻,代理的程度比较重;
如果HttpResponseProxy和ResponseEntityProxy不借助于ConnectionHolder,而是自己能实现相关方法,则可以考虑改为HttpResponseWrapper和ResponseEntityWrapper。
3-3,为什么不使用门面(facade外观)模式
HttpResponseProxy集成HttpResponse和ConnectionHolder两个子系统,提供一个统一的服务界面,这样源代码原封不动,只需改名HttpResponseFacade不挺好的吗?
可能与3-2阐述的原因一样,想要的效果是复制HttpResponse,代理ConnectionHolder的close方法,抓重点是代理,所以还是取名HttpResponseProxy。
浙公网安备 33010602011771号