`
eriol
  • 浏览: 409081 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Head First 设计模式--Adaptor & Facade

阅读更多

Chapter 7 --适配器模式和外观模式

                                   随遇而安

 

1. 适配器实现了目标接口,并且引用一个被适配者。

 

2. 客户使用适配器的过程:

(1) 客户通过目标接口调用适配器的方法对适配器发出请求。

(2) 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口。

(3) 客户收到调用的接口,但并未察觉这一切是适配器在起转换作用。

 

3. 实现一个适配器所需要进行的工作,和目标接口的大小成正比。为了避免改写客户端的代码来调用新的接口,提供一个适配器类,来将所有的改变封装在一个类中是一个比较好的做法。

 

4. 可以创建一个双向的适配器,同时支持新的接口和旧的接口,但是它必须实现所涉及的两个接口。

 

 

适配器模式:

将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

 

Adaptor

Structure

  • Client: 客户只看到目标接口。
  • Adapter: 适配器实现目标接口。适配器与被适配者组合。
  • Adaptee: 所有的请求都委托给被适配者。

 

5. 适配器模式充满了良好的OO设计原则:使用对象组合,以修改的接口包装被适配者。此外,被适配者的任何子类都可以搭配着适配器使用。

 

6. 对象适配器利用组合的方式将请求传送给被适配者,而类适配器继承被适配者和目标类(多重继承)。

 

adaptor

 

 

7. 装饰者模式的意图是不改变接口,但加入责任。适配器模式的意图是将一个接口转成另一个接口。外观模式的意图是简化接口。外观和适配器都可以包装许多类,但它们的区别在于意图不同。

 

8. 外观模式有一个很好的特征:提供简化的接口的同时,依然将系统完整的功能暴露出来,以供需要的人使用。外观没有“封装”子系统的类,它只提供简化的接口。如果客户觉得有必要,依然可以直接使用子系统的类。

 

9. 外观不只是简化了接口,也将客户从组件的子系统中解耦。

 

 

外观模式:

提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让系统更容易使用。

 

facade

Structure

  • Client: 因为有了外观,客户的工作变得更容易了。
  • Facade: 统一的接口易于使用。
  • Subsystem classes: 更复杂的子系统。

 

设计原则:

 

(1) 最少知识(Least Knowledge)原则:只和你的密友谈话。

不要让太多的类耦合在一起,免得修改系统中的一部分,会影响到其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本维护,也会因为太复杂而不容易被其他人了解。

 

就任何对象而言,在该对象的方法内,我们只应该调用属于以下范围的方法:

(1) 该对象本身

(2) 被当做方法的参数而传递进来的对象

(3) 此方法所创建或实例化的任何对象

(4) 对象的任何组件

 

不要调用从另一个调用中返回的对象的方法,如果这样做,相当于向另一个对象的子部分发请求(而增加我们直接认识的对象数目)。该原则要我们改为要求该对象为我们做出请求,这样就不需要认识该对象的组件了。

 

 

本章小结:

  • 当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。
  • 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观。
  • 适配器改变接口以符合客户的期望。
  • 外观将客户从一个复杂的子系统中解耦。
  • 实现一个适配器可能需要一番功夫,也可能不费功夫,视目标接口的大小与复杂度而定。
  • 实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。
  • 适配器模式有两种形式:对象适配器和类适配器。类适配器需要用到多重继承。
  • 你可以为一个子系统实现一个以上的外观。
  • 适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化其接口。
0
6
分享到:
评论

相关推荐

    allure-testng-adaptor-1.3.9.zip

    《全面解析allure-testng-adaptor-1.3.9.zip与primefaces核心功能》 在软件开发领域,测试框架和UI组件库是至关重要的工具。allure-testng-adaptor-1.3.9.zip是一个专门针对TestNG的适配器,而primefaces则是广泛...

    allure-junit-adaptor-1.2.4.zip

    标题 "allure-junit-adaptor-1.2.4.zip" 暗示了这是一个与Allure报告工具和JUnit测试框架相关的开源项目组件。Allure是用于生成详细、美观的测试报告的工具,而JUnit是Java中最广泛使用的单元测试框架之一。这个版本...

    VK5HSE-Pogo-Pin-Adaptor:Pogo Pin夹具允许镜像或常规ICSP连接

    VK5HSE-Pogo-Pin-Adaptor是一种专门设计用于实现镜像或常规ICSP(In-Circuit Serial Programming)连接的工具,它以其独特的Pogo Pin技术,为工程师们提供了更灵活、可靠的编程解决方案。 首先,让我们了解什么是...

    api-gateway-zmq-adaptor:通过ZMQ对API网关的消息队列支持

    api网关zmq适配器 用于API网关的ZMQ适配器,以促进高性能的异步消息传递队列。 它在安装网关的每个节点上都沿着api-gateway进程运行。 地位 此模块正在开发中,并且已被认为已经准备好生产,可以在API网关没有任何...

    Python库 | pytest_testlink_adaptor-0.32-py3-none-any.whl

    python库。 资源全名:pytest_testlink_adaptor-0.32-py3-none-any.whl

    论文研究-A Multimedia Adaptor for Handheld Devices.pdf

    在标题和描述中,提到了“多媒体适配器(Multimedia Adaptor)”、“自动控制(Automatic Control)”和“转码(Transcoding)”这三个关键词。在给出的内容部分,提到手持设备的普及、多媒体网络技术的发展、无线...

    C64-CHARSET-Adaptor-Switch:准将C64字符ROM的适配器

    本文将深入探讨“C64-CHARSET-Adaptor-Switch”这一专为C64设计的字符ROM适配器,解析其工作原理、用途以及如何实现字符集的切换。 C64的默认字符集,也称为PETSCII,是由Commodore开发的一套基于ASCII的字符编码,...

    rustie-wintersmith-adaptor:针对 Rustie 数据运行 Wintersmith 插件的 Rustie 处理器

    《Rustie-Wintersmith-Adaptor:融合Rustie与Wintersmith的创新实践》 在当前的Web开发领域,JavaScript以其强大的生态系统和广泛的应用范围占据着主导地位。然而,随着性能需求的提升和对代码安全性的关注,Rust...

    Android开发框架M-Adaptor

    Android开发框架M-Adaptor是一款专为提升Android应用开发效率而设计的工具,其核心目标是通过利用JavaScript与Activity之间的交互,降低开发者在处理业务逻辑时的编码工作量。这个框架允许开发者用更简洁的方式实现...

    antlr4-intellij-adaptor:一个支持在 jetbrains IDE 插件中使用 ANTLR 语法来构建自定义语言的库

    IntelliJ IDE 中的 ANTLRv4 支持 在基于 IntelliJ 的 IDE 插件开发中支持将 ANTLRv4 语法用于自定义语言的库。 该库具有将 ANTLR 生成的解析树转换为 IntelliJ PSI 树的适配器。 这个库主要是关于适应 ANTLR 解析器...

    node-bunyan-adaptor:将主要的 Bunyan 日志记录方法映射到自定义方法

    npm install bunyan-adaptor --save 句法 var logger = bunyanAdaptor(options); 用法 简单的: var logger = require ( 'bunyan-adaptor' ) ( { log : console . log . bind ( console ) , error : console . ...

    http-jca-adaptor:HTTP Java 连接器架构 1.6 适配器

    的测试框架用于针对本地嵌入式 8 实例和上的远程 8 实例执行单元测试。 #Building 和已用于开发。 要在上针对远程 WildFly 或 JBoss 实例运行测试, wildfly-dev.properties在~/config/ (例如/users/bloke/config ...

    二十三种设计模式【PDF版】

    设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素...

    USB弹出工具

    【USB弹出工具】是一种专为方便用户管理和安全移除USB设备而设计的实用软件,例如USB闪存驱动器、移动硬盘等。标题中的“USBDiskEjector1.3.0.3”指的是该工具的一个特定版本,强调了其在USB设备管理领域的强大功能...

    adaptor设计模式

    适配器设计模式是软件设计领域中的一种经典模式,它在iOS开发中也广泛应用。适配器模式的主要目的是解决系统中不同组件之间的接口不兼容问题,通过创建一个适配器对象,将原有接口转换为所需的接口,使得原本不兼容...

    A Session Initiation Protocol (SIP)-based Peer-to-Peer Internet Telephony Client Adaptor

    In this paper, we describe the design and implementation of our P2P-SIP client adaptor, SIPPEER, using pseudo code and example messages. We also explain how to use existing SIP user agents such as X-...

    0-30 isis_switching_Adaptor_3a_

    描述“Switching adaptor 0-30 volts / 3A”进一步确认了这个适配器的规格,它是一个开关模式电源(Switching Mode Power Supply,简称SMPS),能够提供0到30伏的可调电压,并且最大电流能力为3安培。开关模式电源...

    iterator_adaptor.pdf

    `iterator_adaptor`的设计理念是基于`iterator_facade`,一个用于构建迭代器的基类模板,它定义了迭代器的基本接口。 ### `iterator_adaptor`要求 要使用`iterator_adaptor`,你需要定义一个派生类,该派生类继承...

    12种设计模式源码

    4. **外观模式(Facade Pattern)**:外观模式提供了一个统一的接口,用于与复杂的子系统交互,简化了客户端代码。虽然没有明确的`FacadeStyle`文件夹,但在实际应用中,可能会在多个类中找到对这个模式的应用。 5....

Global site tag (gtag.js) - Google Analytics