【一】一个简单的设计问题:设计运行在简易台灯中的软件。台灯由一个开关和一盏台灯组成。你可以询问开关是开着还是关着,也可以让灯打开或关闭。
----------------------------------------
请考虑下图:
我们为什么不喜欢这个设计呢?
这个设计违反了两个设计原则:依赖导致原则(DIP)和开放封闭原则(OCP)。
----------------------------------------
DIP的违反:Switch依赖了具体类Light。DIP告诉我们要有限依赖于抽象类。
OCP的违反:不是很明显,但更加切中要害。
----------------------------------------
因为它迫使我们在任何需要Switch的地方都要附带上Light。我们不能容易地扩展Switch去管理除Light外的其他对象。
----------------------------------------
Abstract Server Pattern
----------------------------------------
【二】为了解决这个问题,我们使用了一个简单的设计模式:Abstract Server模式。见下图:
我们在Switch和Light之间引入了一个接口,这样就使得Switch能够控制任何实现了这个接口的东西。这立即就满足了DIP和OCP。
========================================
【三】谁拥有这个接口?
作为一个有趣的插入语,请注意接口的名字是从它的客户的角度起的。它被称为Switchable而不是ILight。
接口属于它的客户,而不是它的派生类。客户和接口之间的逻辑绑定关系。它们之间的关系强到在没有Switchable的情况下就无法使用Switch;但是,在没有Light的情况下却完全可以使用switch。逻辑关系的强度和实体(physical)关系的强度是不一致的。继承是一个比关联强得多的实体关系。
在20世纪90年代初期,我们通常认为实体关系支配着一切。有很多名著都建议把继承层次结构一起放到同一个实体包中。这似乎是合理的,因为继承是一种非常强的实体关系。但是在最近的10年中,我们已经认识到
继承的实体强度是一个误导,并且继承层次结构通常也不应该被打包在一起。相反,往往是
把客户和它们控制的接口打包在一起。
这种逻辑和实体关系强度的不一致性是静态语言(像C++和Java)的一个产物。动态类型语言(像Smalltalk、Python和Ruby)不具有这种不一致性,因为它们没有用继承去实现多态行为。
- 大小: 4.4 KB
- 大小: 7 KB
分享到:
相关推荐
- **抽象服务器套接字传感器会话(Abstract Server Socket Sensor Session)**:针对服务器端的传感器会话。 - **抽象串行传感器会话(Abstract Serial Sensor Session)**:适用于通过串行端口通信的RFID阅读器。 ####...
- 示例中的 `<dbServer name="master" parent="abstractServer">` 表示基于 `abstractServer` 的配置来创建 Master 服务器的配置项。 - 同理,可以为每个 Slave 服务器创建类似的配置项,只需要更改 `...
第25章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式 第26章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第27章 案例研究:气象站 第六部分 ETS案例研究 第28章 VISITOR模式 第29章 STATE模式 第30章 ETS...
<dbServer name="abstractServer" abstractive="true"> ${defaultManager} <property name="sendBufferSize">64 <property name="receiveBufferSize">128 <!-- mysql port 端口号 --> <property name="port">...
Data Abstract 支持delphi2011(delphi XE) 由于文件较大分割成3份 需要Remobjects SDK的支持 Remobjects SDK 2011下载地址 http://download.csdn.net/source/3018354
OBSERVER——演化至模式 第33章 ABSTRACT SERVER模式、 ADAPTER模式和BRIDGE模式 第34章 PROXY模式和GATEWAY模式:管理第三方API 第35章 VISITOR模式 第36章 STATE模式 第37章 薪水支付案例研究:数据库 第38章 薪水...
第二十五章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式 第二十六章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第二十七章 案例研究:气象站 第Ⅵ部分 ETS案例研究 第二十八章 VISITOR模式 第二十九章 ...
第25章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式 第26章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第27章 案例研究:气象站 第六部分 ETS案例研究 第28章 VISITOR模式 第29章 STATE模式 第30章 ETS...
在“AbstractFactory案例代码”中,我们可能看到一个实现跨平台数据访问的例子,这里提到了支持SQLServer和Oracle两种数据库。这表明抽象工厂将用于创建与不同数据库交互的适配器或连接对象。在分层架构设计中,通常...
or the latest mobile application with central data storage in the cloud — Data Abstract provides you with the tools to implement both your scalable server tier and the data access inside your client...
RemObjects Data Abstract for Delphi, Server Edition - 9.2.101.1295的安装文件
在RemObjects Data Abstract for .NET中,一个重要的概念是Server Methods。这是一种服务端逻辑的实现方式,允许开发者在服务器端编写处理数据库操作的代码,然后通过客户端调用这些方法,降低了网络传输的数据量,...
DataAbstract 提供了一种抽象层,允许开发者独立于具体的数据库技术工作,这意味着你可以使用同一套代码库连接到多种不同的数据库系统,如 SQL Server、Oracle、MySQL 或 SQLite 等。这种灵活性极大地提高了代码的...
In your client application, Data Abstract provides a simple yet flexible API that makes it easy to request data, modify it, and send it back to the server – right away or later on. All without ...
8. **强大的工具集**:配套的工具如Server Explorer和DataAbstract Designer,帮助开发者可视化地设计和管理数据服务,简化开发流程。 9. **扩展性**:Data Abstract 的设计允许开发者通过插件或自定义实现扩展其...
它支持多种数据库系统,如SQL Server、Oracle、MySQL等。 2. **ORM(对象关系映射)**:Data Abstract实现了ORM机制,允许开发者用面向对象的方式来处理数据库操作,将数据库表映射为Delphi中的类,简化了数据库...
在“RemObjects Data Abstract”标签下,选择“Data Abstract4.0 Combo Server”模板。点击OK,会弹出RemObjects SDK服务端向导。这个模板包含了RemObjects SDK,它是Data Abstract的基础,并且包含了Service ...
在Delphi环境下,Data Abstract提供了一组丰富的组件和API,使得开发者可以轻松地连接到各种数据源,包括关系型数据库(如SQL Server、Oracle、MySQL等)、XML文件、Web服务甚至其他Data Abstract服务器。...