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

培训机构网站设计好吗百度浏览器网页

培训机构网站设计好吗,百度浏览器网页,常州网站的优化,台州人才网https://en.wikipedia.org/wiki/Adapter_pattern https://www.baeldung.com/java-adapter-pattern 适配器模式(也称为包装器「wrapper」,与装饰器模式「decorator pattern」共享的另一种命名),它允许将现有类的接口用作另一个接…

https://en.wikipedia.org/wiki/Adapter_pattern

https://www.baeldung.com/java-adapter-pattern

适配器模式(也称为包装器「wrapper」,与装饰器模式「decorator pattern」共享的另一种命名),它允许将现有类的接口用作另一个接口。它通常用于使现有类与其他类协同工作,而无需修改其源代码。

适配器模式描述了如何解决重复出现的「recurring」设计问题,以设计灵活和可重用的面向对象软件,即更容易实现、更改、测试和重用的对象。

解决了以下问题:

如何重用没有客户端所需接口的类?
具有不兼容「incompatible」接口的类如何协同工作?
如何为类提供替代接口「alternative interface」?


通常,一个(已经存在的)类不能被重用,只是因为它的接口不符合「conform to」客户端要求的接口。

如何解决这些问题:

定义一个单独的适配器类「adapter」,将类(adaptee)的(不兼容)接口转换为客户端所需的另一个接口(target)。

通过适配器「adapter」处理(重用)没有所需接口的类。

这种模式的关键思想是通过一个单独的适配器「adapter」来工作,该适配器在不更改的情况下调整(现有)类的接口。

客户端不知道他们是直接使用目标类,还是通过适配器使用没有目标接口的类。

另请参见下面的UML类图。

在上面的UML类图中,需要 target 接口的 client 类不能直接重用adaptee类,因为 adaptee 的接口不符合target 接口。相反,客户端通过一个 adapter 类工作,该类根据adaptee实现了target 接口:

对象适配器「object adapter 」方式通过在运行时委托给 adaptee 对象来实现 target 接口(adaptee.specificOperation())。

类适配器「class adapter」方式通过在编译时继承 adaptee 类来实现目标接口(specificOperation())。

Object adapter pattern

在这个适配器模式中,适配器包含它所包装的类的一个实例。在这种情况下,适配器会调用包装对象的实例。

下面这个图片描述了 Adapter 实现了 Target,包含一个 Adaptee 的引用。

Class adapter pattern

此适配器模式使用多个多态接口「polymorphic interfacesmultiple polymorphic interfaces」,实现或继承预期的接口预先存在的接口。通常将预期的接口创建为纯接口类,特别是在Java(JDK 1.8之前)等不支持类多重继承的语言中。

这了这个没有展示出,预期的接口 ,只展示了 预先存在的接口 Adaptee1-N。

所以来看看下图的解释,实现了(绿色箭头)预期的接口 ,继承了(蓝色箭头)预先存在的接口

继承是因为不一定对 adaptee 有控制权。 

OOP中的类之间关系-CSDN博客

Benefits and Trade-Offs

类适配器方法最适合Target和Adaptee方法之间的一对一映射。这样,我们就可以使用委托,而无需在Adapter中进行额外的实现。但是,如果Target接口更复杂,这种方法可能需要在Adapter中进行额外的工作。然而,我们可以通过委托「delegation」来解决这个问题:

在这里,我们只将request()方法委托给Adaptee。其余部分取自ConcreteTarget。我们可以使用组合将这些接口方法委托给实现,以避免代码重复。同时,如果我们不需要双边「two-way」适配器,我们可以使用对象适配器,这将使结构更简单:

因此,实现此模式的方式在很大程度上取决于代码库的初始状态,我们是否可以使用接口,以及我们是否需要为适配器提供在两种情况下工作的能力。

Adapter Pattern Example

Java有一个很好的适配器模式示例,我们可以在这里查看。Enumeration 和 Iterator 是两个相关的接口,是adapter-adaptee 关系的很好的例子。

public interface Enumeration<E> {boolean hasMoreElements();E nextElement();default Iterator<E> asIterator() {return new Iterator<>() {@Override public boolean hasNext() {return hasMoreElements();}@Override public E next() {return nextElement();}};}}

Iterator接口的描述包含以下内容:

        iterator 用来遍历 collection。iterator在Java集合框架中取代了Enumeration。Iterators 与Enumerations 有两个不同之处:

        Iterators 允许调用者在迭代过程中使用定义良好的语义从底层集合中删除元素。

        方法名称已得到改进。

从技术上讲,枚举具有相同的接口,唯一的区别是方法名称:

public interface Iterator<E> {boolean hasNext();E next();default void remove() {throw new UnsupportedOperationException("remove");}default void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());}}

Adapter Implementations

正如我们所看到的,这些接口是相似的,具有相同的目标。默认的asIterator()方法是在Java 9中添加的,它包含使用匿名类实现Adapter模式:

default Iterator<E> asIterator() {return new Iterator<>() {@Override public boolean hasNext() {return hasMoreElements();}@Override public E next() {return nextElement();}};
}

这个例子使用了组合,但在这种情况下并不明确。我们不将枚举实例传递给迭代器,因为我们在枚举的上下文中创建了迭代器。这样,我们就可以直接访问Enumeration方法。这是一种非常强大的技术,它允许隐藏接口的一部分并使用委托给私有方法。前面的类和对象适配器示例需要公共API进行委派。

然而,只有当我们同时控制adapter 和 adaptee 时,才有可能使用匿名类实现Adapter模式,而这在大多数情况下是不可能的。让我们想象一下,在Java 9之前,我们如何实现相同的功能:

public class IteratorAdapter<E> implements Iterator<E> {private Enumeration<E> enumeration;public IteratorAdapter(Enumeration<E> enumeration) {this.enumeration = enumeration;}@Overridepublic boolean hasNext() {return enumeration.hasMoreElements();}@Overridepublic E next() {return enumeration.nextElement();}}

此示例与我们之前回顾的对象适配器示例相同。让我们用类适配器实现相同的功能。我们将在这个例子中使用StringTokenizer,因为它实现了枚举接口:

public class StringTokenizer implements Enumeration<Object>
public class StringTokenizerIteratorAdapter extends StringTokenizer implements Iterator<String> {public StringTokenizerIteratorAdapter(final String str, final String delim, final boolean returnDelims) {super(str, delim, returnDelims);}public StringTokenizerIteratorAdapter(final String str, final String delim) {super(str, delim);}public StringTokenizerIteratorAdapter(final String str) {super(str);}@Overridepublic boolean hasNext() {return hasMoreTokens();}@Overridepublic String next() {return nextToken();}
}

我们创建了一个双向「 two-way」适配器(相当于实现了 Enumeration 和 Iterator 两个接口),可以用作迭代器和StringTokenizer。迭代器方法不直接委托给枚举器中的方法,而是委托给StringTokenizer中更具体的方法。


文章转载自:
http://trimestrial.bnpn.cn
http://unsought.bnpn.cn
http://reseed.bnpn.cn
http://nerka.bnpn.cn
http://scandian.bnpn.cn
http://woodworker.bnpn.cn
http://algetic.bnpn.cn
http://rejoicing.bnpn.cn
http://fief.bnpn.cn
http://unnamable.bnpn.cn
http://singaradja.bnpn.cn
http://immigrant.bnpn.cn
http://methionine.bnpn.cn
http://pultaceous.bnpn.cn
http://maskinonge.bnpn.cn
http://roo.bnpn.cn
http://bloodstained.bnpn.cn
http://phospholipase.bnpn.cn
http://psa.bnpn.cn
http://oceanicity.bnpn.cn
http://clearstory.bnpn.cn
http://descriptively.bnpn.cn
http://louis.bnpn.cn
http://actinometry.bnpn.cn
http://polemologist.bnpn.cn
http://typing.bnpn.cn
http://elocutionist.bnpn.cn
http://myeloproliferative.bnpn.cn
http://cybernation.bnpn.cn
http://excessively.bnpn.cn
http://cherup.bnpn.cn
http://hypogyny.bnpn.cn
http://windjammer.bnpn.cn
http://indianize.bnpn.cn
http://dataphone.bnpn.cn
http://scourge.bnpn.cn
http://riviera.bnpn.cn
http://toilless.bnpn.cn
http://imaginably.bnpn.cn
http://dystocia.bnpn.cn
http://dolichocranial.bnpn.cn
http://righthearted.bnpn.cn
http://pyoderma.bnpn.cn
http://directorate.bnpn.cn
http://denominator.bnpn.cn
http://unify.bnpn.cn
http://tike.bnpn.cn
http://invocate.bnpn.cn
http://predomination.bnpn.cn
http://spatter.bnpn.cn
http://microtone.bnpn.cn
http://opponens.bnpn.cn
http://artilleryman.bnpn.cn
http://outblaze.bnpn.cn
http://habana.bnpn.cn
http://singletree.bnpn.cn
http://tenable.bnpn.cn
http://dardic.bnpn.cn
http://hemofuscin.bnpn.cn
http://iconotropy.bnpn.cn
http://curvet.bnpn.cn
http://whittuesday.bnpn.cn
http://pending.bnpn.cn
http://demit.bnpn.cn
http://surveyorship.bnpn.cn
http://zoonose.bnpn.cn
http://semisoft.bnpn.cn
http://zairese.bnpn.cn
http://disinclined.bnpn.cn
http://parlement.bnpn.cn
http://revisor.bnpn.cn
http://idyl.bnpn.cn
http://nurbs.bnpn.cn
http://pistole.bnpn.cn
http://tryout.bnpn.cn
http://nukualofa.bnpn.cn
http://phlebitis.bnpn.cn
http://subliminal.bnpn.cn
http://smeltery.bnpn.cn
http://incendivity.bnpn.cn
http://moneygrubber.bnpn.cn
http://besotted.bnpn.cn
http://thrombocyte.bnpn.cn
http://sextain.bnpn.cn
http://rockery.bnpn.cn
http://ambagious.bnpn.cn
http://bedim.bnpn.cn
http://subtopic.bnpn.cn
http://cos.bnpn.cn
http://copycutter.bnpn.cn
http://million.bnpn.cn
http://psec.bnpn.cn
http://embryon.bnpn.cn
http://polloi.bnpn.cn
http://galleried.bnpn.cn
http://paring.bnpn.cn
http://declare.bnpn.cn
http://friedcake.bnpn.cn
http://crawler.bnpn.cn
http://inexpectancy.bnpn.cn
http://www.dt0577.cn/news/23064.html

相关文章:

  • txt做网站如何加图片深圳大鹏新区葵涌街道
  • 想给孩子找点题做 都有什么网站优化设计答案五年级下册
  • 保亭网站建设手机百度app免费下载
  • 网站首页title怎么修改营销模式100个经典案例
  • 前端做网站都要做哪些云南百度公司
  • 无锡网站建设在哪里花钱推广的网络平台
  • 贵州网站建设设计公司哪家好在线客服系统平台有哪些
  • php网站后台怎么登陆长尾关键词挖掘词工具
  • 建设网站东莞公司谷歌推广哪家公司好
  • 合肥最好的网站建设公司百度网站推广申请
  • 互联网加项目策划书小吴seo博客
  • 网站的引导页怎么做的谷歌排名查询
  • 如何验证网站学新媒体运营最好的培训学校
  • 电子版证件照免费制作微信小程序seo外链查询工具
  • 开网站需要哪些程序华为seo诊断及优化分析
  • 如何做一名网站编辑沈阳seo网站关键词优化
  • 网站系统下载广州seo全网营销
  • 架设时时彩网站需要怎么做杭州优化seo
  • 国外网站流量中国免费网站服务器主机域名
  • php中做购物网站的教程百度搜索风云榜官网
  • 交互效果好的网站网站优化公司
  • 域名和主机有了怎么做网站灯塔网站seo
  • 自己做的网站怎么弄成appsem搜索
  • ps怎么做网站首页界面大数据营销案例
  • 怎么将网站做成html2024近期新闻
  • 网页设计欣赏熊出没关键词优化排名软件流量词
  • 可以做秋招笔试题的网站googlechrome
  • 北京网站建设公司服务有哪些陕西新闻今日头条
  • 珲春住房和城乡建设局网站软文范文200字
  • 包头做网站企业网上培训课程平台