对于控制和实现,这三个模式体现着三个不同的层次,如果加上不使用任何模式,就是有四个层次了。
这里所说的层次,没有高低之分,只有需求的区分。如果对于一个没有任何变化的需求,而使用上Bridge模式,也同样是一个丑陋的设计。
什么是控制和实现?抄一个《ASD》中的例子,一个照明设备(灯),他有两部分。一个是开关,一个是灯泡。开关有两个操作,开和关。灯泡也有两个操作,发光或不发光。
最简单的控制和实现,只有两个类。一个控制类,一个实现类。控制类面对用户,实现类实现具体操作。这就是不使用模式的方法。
有时候,同一个控制可以搭配多种不同的实现。例如,开关可以搭配多种不同的灯,A灯、B灯、C灯,虽然都是发光或不发光,可是实现却各不相同。每种灯都有自己的类。
这时的解法也是很自然的,添加一个抽象的灯类,有两个抽象方法:发光和不发光,所有具体的灯类都从这个抽象灯类派生。开关类只和这个抽象类打交道,不关心具体灯类了。
这样就把控制类和具体的实现类分离开来了。非常简单,这就是Abstract Server模式。
使用Abstract Server模式,要求所有的具体实现类,都从同一个接口派生出来。然而有时候,这是作不到的。最典型的情况就是,我们已经有了一个不可修改的实现,比如某个第三方提供的库。
这就是说,我们有两个相似但不一样的接口,这时候,理所当然地就该使用Adapter模式。就是新建一个Adapter类从这个接口派生,并包含一个到真正的具体实现类的链接。一切托付到Adapter类的调用,都转换成具体实现类的接口,并托付给具体实现类来完成。
然而,有时候,新的实现和接口有很大的差异,比如,有些灯在发光之前先需要预热,这个灯就有三个方法,预热、发光、不发光。可是还需要用同一个开关来控制。这时候怎么办呢?
Bridge模式?嘿嘿,还没有到她登场的时候。
这时候,还是可以用Adapter模式来解决,让这个灯的Adapter在发光这个方法中,分别依次调用该灯实现类的预热方法和发光方法就可以了。
可是有时候,这个不是一种灯需要预热,而是一类灯需要预热。也就是说,A灯商、B灯商、C灯商、D灯商都生产两种灯泡,一个是需要预热的,一个是不需要预热的。
想想看,需要多少Adapter来满足这样的需求?
如果之后,突然又出现一种在关灯之后,需要冷却的灯,并且ABCD都有制造这种灯又怎么办?就是说得为ABCD都添加一种Adapter。
如果之后,又出现了E厂商,每种灯泡都制造,那又怎么办?
考察这里的变化,其实这里有两个变化纬度,一个是灯的操作方法,一个是具体厂商。当两重因素一齐变化的时候,只使用一层抽象来应对,当然是不行的。
解决方法,就是再添加一层抽象。把实现类的接口变成两层。一层是控制逻辑,她的实现类中包括需要预热再点亮的逻辑实现,包括需要关灯后再散热的逻辑实现。另一层接口是针对具体厂商。当然她必须包括所有在控制逻辑层需要使用的方法。
现在,当一个变化出现的时候,只需要添加一个类就可以了。这就是Bridge模式。
再强调一次,模式的使用一定要按照需求来安排。虽然Bridge模式很cool,但是如果就只有一个开关,一个灯泡,并且永不更换,那么使用Bridge模式就是典型的烂设计。

- 大小: 53.8 KB

- 大小: 64.9 KB

- 大小: 71.4 KB

- 大小: 125 KB
分享到:
相关推荐
VS2008工程 自己看书时写的例子程序,简单明了,供大家学习参考。 如有不对之处,请多谅解。...AbstractFactory Adapter Bridge chainResponsibility Command Composite Facade Factory Iterator Prototype Proxy
Data Abstract 支持delphi2011(delphi XE) 由于文件较大分割成3份 需要Remobjects SDK的支持 Remobjects SDK 2011下载地址 http://download.csdn.net/source/3018354
4. **AbstractClass.h/cpp**: 抽象类的头文件和源文件,它包含了对Bridge接口的引用,并通过成员变量来持有具体实现类的实例。 5. **RoutedUI.h/cpp**: 代表UI组件的类,它继承自AbstractClass,并实现与用户交互的...
通用`RecyclerView.Adapter` 的目标是实现一个可以处理不同类型视图(ViewHolder)的Adapter,这样在不同的数据项需要不同展示样式时,我们只需要创建新的ViewHolder,而不需要修改Adapter的主体逻辑。 ### 三、...
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 ...
在“AbstractFactory案例代码”中,我们可能看到一个实现跨平台数据访问的例子,这里提到了支持SQLServer和Oracle两种数据库。这表明抽象工厂将用于创建与不同数据库交互的适配器或连接对象。在分层架构设计中,通常...
RemObjects Data Abstract for Delphi, Server Edition - 9.2.101.1295的安装文件
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...
在Bridge模式中,抽象类(Abstract Class)和实现类(Implementor Class)是两个独立的继承体系,通过一个“桥梁”类(Bridge Class)进行连接,使得抽象部分可以动态地更换不同的实现部分,实现部分也可以独立地...
在RemObjects Data Abstract for .NET中,一个重要的概念是Server Methods。这是一种服务端逻辑的实现方式,允许开发者在服务器端编写处理数据库操作的代码,然后通过客户端调用这些方法,降低了网络传输的数据量,...
Undergraduate text on Abstract algebra
在实际应用中,开发者可以将"rdf-store-abstract"与其他RDF存储系统的适配器结合使用,例如` rdf-store-abstract-adapter-mongo`或` rdf-store-abstract-adapter-sparql`,以便将RDF数据存储在MongoDB或SPARQL服务器...
#### 一、Abstract与Cadence Virtuoso在IC设计中的应用 **Abstract**在集成电路(IC)设计流程中扮演着重要角色,尤其在将图形数据系统(GDS)格式文件转换为库交换格式(LEF)文件的过程中。此过程对于实现物理...
DataAbstract 提供了一种抽象层,允许开发者独立于具体的数据库技术工作,这意味着你可以使用同一套代码库连接到多种不同的数据库系统,如 SQL Server、Oracle、MySQL 或 SQLite 等。这种灵活性极大地提高了代码的...
Bridge模式是一种设计模式,主要目的是将抽象部分与实现部分解耦,使得它们可以独立地进行变化。在Java编程中,这种模式的应用可以帮助我们构建更灵活、可扩展的系统。Bridge模式通常由四个主要角色组成:抽象...
C# 中 override、abstract、virtual、interface 的比较 在 C# 编程语言中,override、abstract、virtual、interface 是四个关键字,它们之间存在着紧密的联系,我们经常会遇到 override、abstract、virtual 这三个...
在这个“Data Abstract Sample for .NET-CSharp”中,我们将深入探讨如何在C#环境下利用数据抽象技术来构建高效的、可扩展的应用程序。 首先,让我们了解一下什么是RemObjects。RemObjects是为多种编程语言提供跨...
Data Abstract是一款强大的软件开发框架,尤其适用于创建分布式应用程序。它为开发者提供了一种高效、安全且灵活的方式来在客户端和服务器之间传输数据。本教程将深入探讨如何利用Data Abstract框架进行应用软件开发...
A First Course in Abstract Algebra (6th Edition) by John B.Fraleigh