当前位置: 首页 > news >正文

设计模式之Facade,Adapter, Proxy

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Facade,Adapter,Proxy模式有点类似,功能上都是对调用者提供调用接口,但他们的目的就有些不同。最近正在做一个域名系统,其中就用到了Facade和Adapter模式。正好结合项目来分析下这几种设计模式的不同。


Adapter是为了保持已有接口的不变性,而不管调用模块或者层次间代码的变化。因为需求及性能等的不同考虑,我们的DNS服务器即有传统的较高性能的BIND,又有性能较低但是灵活性大大提高的BIND DLZ。而添加一条纪录必须要能够往这两种服务器中添加。显然上层不会考虑添加这个纪录的区别,所以我们需要一个Adapter层来提供统一接口屏蔽掉两种不同系统的区别。



Facade是为了屏蔽掉被调用者的一系列复杂操作,对调用者提供的一个接口来完成一系列的工作。

在我们的域名系统中数据中心也就是管理BIND,BIND DLZ中记录的模块只提供了最基本的记录操作以及一些简单的基本组合操作。而注册域名及IP等需要数条操作才能完成工作,此时我们的Agent并不想要进行那么复杂的一系列操作,所以我们提供了一个Facade,来对这些操作进行包装,Agent只需要调用一个接口就可以完成它的工作了。

图并没有采用什么的例子,而是采用update=del+add的一张图,因为觉得这个例子非常适合理解Facade模式,删除原有数据{KEY:VALUE1},新增数据{KEY:VALUE2},这样实际上就组成了Update操作(不要说谁会将Update修改成Del和Add,这个应该是大家最能理解的例子之一)。所以我们可以新增一个Facade类,对Caller提供Update接口,这样Caller完成这项工作就轻松了很多。



Adapter跟Facade在实现上往往有点像,但是从目的上来区分却是一目了然的:

Adapter提供一个接口来屏蔽一些代码的不确定性:第三方库的改变,系统平台层次的改变,方案的改变等

Facade提供一个接口来屏蔽一系列操作的复杂性:我只想要结果,随你怎么玩


Proxy与Adapter的区别应该还是很好理解的,但是与Facade的区别在于哪儿呢?说实话我在项目中并没有在代码层次直接使用过这个模式。但是在项目层次中确也有使用过,如使用nginx来做反向代理来达到负载均衡的目的,我的理解是Proxy比Facade的区别在于更加独立,客户端完全不知道也不需要知道具体的实现,只是通过Proxy来完成即可。所以Facade应该是调用较多,而Proxy很多情况都是不同系统间的通讯,通过发送消息来完成通讯。理解的不一定对,记录下先。




转载于:https://my.oschina.net/caoxinyu0205/blog/741827

相关文章:

  • 使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer
  • 通讯录--(适配iOS7/8/9)
  • delphi关键字
  • JavaScript之面向对象学习五(JS原生引用类型Array、Object、String等等)的原型对象介绍...
  • Bootstrap结合BootstrapTable的使用,分为两种模试显示列表。 自适应表格,自定义行列...
  • Zabbix监控之Redis自动发现并监控(python)
  • SQLServer · 特性分析 · SQL Server 2012的分析函数未必都理解透了(1)
  • 重定向Http status code 303 和 302
  • 输入一组数组,回车结束
  • Java反射在JVM的实现
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)...
  • jdbc conn.commit()提交事务和 rollback()使用
  • 每天一个linux命令:mkdir命令
  • 程序(进程)内存分布解析【转】
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2018一半小结一波
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • centos安装java运行环境jdk+tomcat
  • GraphQL学习过程应该是这样的
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • markdown编辑器简评
  • Node + FFmpeg 实现Canvas动画导出视频
  • PAT A1017 优先队列
  • Redis的resp协议
  • Shell编程
  • storm drpc实例
  • TypeScript实现数据结构(一)栈,队列,链表
  • vuex 学习笔记 01
  • 给第三方使用接口的 URL 签名实现
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 再次简单明了总结flex布局,一看就懂...
  • 自定义函数
  • Semaphore
  • ​【已解决】npm install​卡主不动的情况
  • ​ubuntu下安装kvm虚拟机
  • #FPGA(基础知识)
  • #考研#计算机文化知识1(局域网及网络互联)
  • (10)STL算法之搜索(二) 二分查找
  • (3)STL算法之搜索
  • (4)logging(日志模块)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (笔试题)合法字符串
  • (翻译)terry crowley: 写给程序员
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十八)三元表达式和列表解析
  • (原)Matlab的svmtrain和svmclassify
  • (转)【Hibernate总结系列】使用举例
  • (转)Google的Objective-C编码规范
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET DataGridView数据绑定说明
  • .NET Framework 4.6.2改进了WPF和安全性