适配器模式:类适配器与对象适配器

问题描述 投票:0回答:7

我有一些关于适配器模式的问题。我知道类适配器继承自适配器,而对象适配器将适配器作为对象而不是继承它。

什么时候你会使用类适配器而不是对象适配器,反之亦然?另外,使用类适配器和对象适配器的利弊是什么?

oop design-patterns adapter software-design
7个回答
26
投票

我可以看到对象适配器的一个优点,具体取决于您的编程语言:如果后者不支持多重继承(例如Java),并且您想一次适应多个适配器,那么您将不得不使用对象适配器。

对象适配器的另一点是,您可以让包装的适配器按照需要的方式生活(特别是实例化,只要您在适配器之后实例化您的适配器),而不必指定所有参数(适配器的部分和适配器的部分)对于您的适配器,因为继承)当您实例化您的适配器时。这种方法对我来说显得更灵活。


15
投票

Class Adapter
是普通的继承,在每种面向对象语言中都可用,而
Object Adapter
适配器设计模式的经典形式。

Object Adapter
(因此
Class Adapter
)相比,
Inheritance
的最大好处是客户端和适应者的松耦合


14
投票

更喜欢使用组合,而不是继承

首先说我们有一个用户;

public interface IUser
{
    public String Name { get; }
    public String Surname { get; }
}

public class User : IUser
{
    public User(String name, String surname)
    {
        this.Name = name;
        this.Surname = surname;
    }

    public String Name { get; private set; }
    public String Surname { get; private set; }
}

现在,想象一下,无论出于何种原因,您都需要为用户类提供一个适配器,那么我们有两种方法,通过继承或通过组合;

//Inheritance
public class UserAdapter1 : User
{
    public String CompleteName { get { return base.Name + " " + base.Surname } }
}

//Composition
public class UserAdapter2
{
    private IUser user;

    public UserAdapter2(IUser user)
    {
        this.user = user;
    }

    public String CompleteName { get { return this.user.Name + " " + this.user.Surname; } }
}

你完全没问题,但如果系统不增长...想象一下,你需要实现一个 SuperUser 类,以便处理新的需求;

public class SuperUser : IUser
{
    public SuperUser(String name, String surname)
    {
        this.Name = name;
        this.Surname = surname;
    }

    public String Name { get; private set; }
    public String Surname { get; private set; }

    public Int32 SupernessLevel { get { return this.Name.Length * 100; } }
}

通过使用继承,您将无法重用您的适配器类,从而弄乱您的代码(因为您必须实现另一个适配器,从 SuperUser 继承,它将执行与其他类完全相同的操作!!!)。 .. 接口的使用都是关于解耦的,这就是我 99% 可能使用它们的主要原因,当然,如果选择取决于我的话。


4
投票

类适配器使用多重继承将一个接口适配到另一个接口:(取决于您的编程语言:Java 和 C# 不支持多重继承) enter image description here

对象适配器取决于对象组合: enter image description here

图片来源:《设计模式(可重用面向对象软件的元素)》一书


3
投票
  • 类适配器当我们想要适应一个类及其子类时,通过提交特定的适配器类来使Adaptee适应Target是行不通的。
  • 对象适配器允许单个适配器与许多适应者(适应者和所有适应者层次结构)一起工作

2
投票

除了renatoargh在他的回答中提到的之外,我还想添加类适配器的优点

在类适配器中,如果需要,您可以轻松地覆盖适配器的行为,因为您只是对其进行子类化。在对象适配器中更难。

然而,对象适配器的优势通常胜过类适配器的这一微小优势。


0
投票

如果你要适配的类是第三方的并且标记为sealed。我认为在这种情况下,您将无法通过继承适配器来创建包装类适配器

© www.soinside.com 2019 - 2024. All rights reserved.