首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我们是否每次扩展类并实现其接口方法时都使用适配器设计模式?

我们是否每次扩展类并实现其接口方法时都使用适配器设计模式?
EN

Stack Overflow用户
提问于 2017-05-03 03:02:07
回答 1查看 149关注 0票数 0

我对适配器设计模式的理解是,我们允许将现有类的接口用作另一个接口。

因此,每次在java中扩展或实现类时,我们都使用适配器模式吗?这段代码是使用适配器设计模式的吗?

代码语言:javascript
运行
复制
public class car extends flyingMachine{

  void drive(){}

  @override
  void fly(){}

}

网上有很多关于这个模式的信息,但是没有什么能为我澄清这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-03 03:14:25

不继承不是适配器模式.

假设您有您的Car和驱动器()方法(它实际上应该实现一个接口,比如Moveabledrive()方法)。现在还有一些其他类,它们接受Moveable的参数。

代码语言:javascript
运行
复制
public class MakeItSo
{
   public void easeOnDown(Moveable thing)
   { 
      thing.drive();
   }
}

现在假设您有一个由其他人提供的酷酷的新类Spaceship,并且它有一个方法warp()。而且它没有实现Moveable,但是您希望使用MakeItSo类。该怎么办呢?

这就是适配器模式可以提供帮助的地方。在这种情况下,您可以创建一个新类来实现(或者可以扩展,但在许多情况下这是非常混乱的) Moveable接口,但如下所示:

  • 用飞船建造的
  • 允许drive()方法调用warp()方法
代码语言:javascript
运行
复制
public class MoveableSpaceship implements Moveable  
{  
    private Spaceship ship;

    public MoveableSpaceship(Spaceship s)
    {
       ship = s;
    } 

    @Override
    public void drive()
    {
       ship.warp();
    }
}

现在你可以:

代码语言:javascript
运行
复制
Spaceship enterprise = getSpaceship();  //from wherever
MoveableSpaceship ncc1701 = new MoveableSpaceship(enterprise);
MakeItSo doIt = new MakeItSo();
doIt.easeOnDown(ncc1701);

因此,尽管MakeItSo.easeOnDown只知道Moveable,而Spaceship没有实现Moveable,但使用适配器模式,现在可以通过适配器模式使用带有Spaceship对象的MakeItSo类。

注意:更新后的类与我最初没有正确解释的注释相匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43750359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档