这篇文章主要介绍“使用Adapter模式时需要考虑哪些因素”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“使用Adapter模式时需要考虑哪些因素”文章能帮助大家解决问题。
效果
类适配器和对象适配器有不同的权衡。类适配器
• 用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
这是类适配器的缺点。
• 使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
作为派生类,可以很简单地修改基类的行为并直接被Adapter适用。
• 仅仅引入了一个对象,并不需要额外的指针以间接得到adaptee。
比对象适配器少占一个指针变量的空间,并且不需要另外建立Adapter和Adaptee之间的关系。
对象适配器则
• 允许一个Adapter与多个Adaptee—即Adaptee本身以及它的所有子类(如果有子类的话)—同时工作。Adapter也可以一次给所有的Adaptee添加功能。
这是很方便的!
• 使得重定义Adaptee的行为比较困难。这就需要生成 Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。
需要替换Adapter引用的Adaptee对象。
相比较而言,对象适配器多用一个指针变量,多一些程序性的操作获得了更大的灵活性。作者推荐对象适配器。
使用Adapter模式时需要考虑的其他一些因素有:
1) Adapter的匹配程度
对Adaptee的接口与Target的接口进行匹配的工作量各个Adapter可能不一样。工作范围可能是,从简单的接口转换(例如改变操作名 )到支持完全不同的操作集合。Adapter的工作量取决于Target接口与Adaptee接口的相似程度。
道理很简单:差别越多,适配的工作量也就越大。
2) 可插入的Adapter
当其他的类使用一个类时,如果所需的假定条件越少,这个类就更具可复用性。如果将接口匹配构建为一个类,就不需要假定对其他的类可见的是一个相同的接口。也就是说,接口匹配使得我们可以将自己的类加入到一些现有的系统中去,而这些系统对这个类的接口可能会有所不同。Object-Work / Smalltalk [ P a r 9 0 ]使用pluggable adapter一词描述那些具有内部接口适配的类。
这段话不大好理解,作者努力解说一下。当我们设计一个类时,一般都存在一些假设。例如内存可以随意适用,不需要多任务安全等。这样的假设越少,类可以适用的场景就越多,也就是说更具可复用性。众多假设中有一个就是类的用法,也就是接口。使用适配器意味着类可以任何方式适用。
考虑TreeDisplay窗口组件,它可以图形化显示树状结构。如果这是一个具有特殊用途的窗口组件,仅在一个应用中使用,我们可能要求它所显示的对象有一个特殊的接口,即它们都是抽象类Tree的子类。如果我们希望使TreeDisplay有具有良好的复用性的话(比如说,我们希望将它作为可用窗口组件工具箱的一部分),那么这种要求将是不合理的。应用程序将自己定义树结构类,而不应一定要使用我们的抽象类Tree。不同的树结构会有不同的接口。
一般来讲,TreeDisplay组件需要和某种Tree类协同工作。如果这个TreeDisplay只是在一个应用中使用,那么我们可以完全可以将需要TreeDisplay表示的数据设计成Tree的子类。但是如果希望TreeDisplay可以在各种场合,各种应用中使用时,就不应该有这个要求。因为对于已有类,这意味着类结构的巨大变化;对于新设计的类,为了一个表示功能,改变类本来的继承关系也有些过分了。
例如,在一个目录层次结构中,可以通过GetSubdirectories操作进行访问子目录,然而在一个继承式层次结构中,相应的操作可能被称为GetSubclasses。尽管这两种层次结构使用的接口不同,一个可复用的TreeDisplay窗口组件必须能显示所有这两种结构。也就是说,TreeDisplay应具有接口适配的功能。
如果从取得下一级要素的角度来看,GetSubdirectories和GetSubclasses做的是相同的事。我们的设计的TreeDisplay需要满足上述两种要求。这属于主动适配的范畴。
3) 使用双向适配器提供透明操作 使用适配器的一个潜在问题是,它们不对所有的客户都透明。被适配的对象不再兼容Adaptee的接口,因此并不是所有Adaptee对象可以被使用的地方它都可以被使用。双向适配器提供了这样的透明性。在两个不同的客户需要用不同的方式查看同一个对象时,双向适配器尤其有用。
一般来讲,适配器考虑的是让Adaptee的功能在Adapter的上下文中被使用。在Adaptee的利用者看来,Adapter要么不可见(对象适配器),要么不一定好用(类适配器)。当我们需要从两个方向都有需要使用某功能时,就需要双向适配器。
考虑一个双向适配器,它将图形编辑框架 Unidraw [VL90]与约束求解工具箱QOCA[ H H M V 9 2 ]集成起来。这两个系统都有一些类,这些类显式地表示变量: Unidraw含有类StateVariable,QOCA中含有类ConstraintVariable,如下图所示。为了使Unidraw与QOCA协同工作,必须首先使类ConstraintVariable与类StateVariable相匹配;而为了将QOCA的求解结果传递给Unidraw,必须使StateVariable与ConstraintVariable相匹配。
双向适配器在两个方向都有效。
这一方案中包含了一个双向适配器ConstraintStateVariable,它是类ConstraintVariable与类StateVariable共同的子类,ConstraintStateVariable使得两个接口互相匹配。在该例中多重继承是一个可行的解决方案,因为被适配类的接口差异较大。双向适配器与这两个被匹配的类都兼容,在这两个系统中它都可以工作。
本例中使用的是类适配器,ConstraintStateVariable即是ConstraintVariable又是StateVariable;其实也应该可以是使用对象适配器,这时ConstraintVariable和StateVariable共通分享一个ConstraintStateVariable。
关于“使用Adapter模式时需要考虑哪些因素”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。