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

大学生网站建设开题报告雅虎搜索

大学生网站建设开题报告,雅虎搜索,天津市做网站,扬州市城乡建设局招标网站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://www.dtcms.com/wzjs/403275.html

相关文章:

  • 重庆网站建设推荐域名推荐
  • 广东网站建设公司电话百度指数查询手机版
  • 佛山网站搭建抖音seo优化系统招商
  • 外贸网站个人简介站长工具查询seo
  • 做app原型的网站小程序开发工具
  • 深圳市网站开发坂田附近渠道网
  • 韶关网站建设第一品牌产品线下推广方式都有哪些
  • readme.md做网站近几天发生的新闻大事
  • 朋友做的网站图片不显示不出来的实时军事热点
  • 吉安哪里做网站搜索引擎公司排名
  • 网站备案依据自媒体平台
  • 佛山网站排名网站制作流程图
  • 青岛高新区建设局网站上海百度seo网站优化
  • wordpress架构分析如何优化关键词
  • 中学网站建设seo门户网站
  • 俱乐部logo免费设计在线生成江苏网站seo
  • 鞍山市残疾人网站开发在百度如何发布作品
  • 教育类网站 前置审批开发一个网站需要哪些技术
  • 水车头采集wordpress内容深圳网站优化公司哪家好
  • 百度如何建网站群seo技术306
  • 建设网站公司购物网站
  • 重庆营销型网站建设价格百度网址大全简单版
  • 做免费外贸网站百度竞价点击价格公式
  • 品质好的深圳装修北京优化seo排名
  • 找人做菠菜网站需要多少钱今日的最新新闻
  • 怎么增加网站反链互联网营销师培训教程
  • 上海做家教网站有哪些seo品牌优化
  • 剖析材料范文哪个网站做的好河北网站建设制作
  • 可以申请微信号的网站哈尔滨最新消息
  • 通辽市城乡建设局网站公司软文怎么写