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

Sil*_*olt 31 oop design-patterns software-design adapter

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

您何时在对象适配器上使用类适配器,反之亦然?另外,使用类适配器和对象适配器的权衡取舍有哪些权衡?

Emm*_*uel 23

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

对象适配器的另一个要点是,您可以让被包装的适配器按照他们想要的生活(实例化,特别是实例化,只要您在适配器后实例化适配器),而无需指定所有参数(适配器的部件和部件用于在实例化适配器时,由于继承而适应.这种方法对我来说更灵活.


Ren*_*ama 13

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

首先说我们有一个用户;

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; }
}
Run Code Online (Sandbox Code Playgroud)

现在,想象一下,由于任何原因,你需要为用户类提供一个适配器,我们有两个aproaches,通过继承或复合;

//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; } }
}
Run Code Online (Sandbox Code Playgroud)

你完全没问题,但是如果系统没有增长......想象一下你需要实现一个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; } }
}
Run Code Online (Sandbox Code Playgroud)

通过使用继承,你将无法重新使用你的适配器类,弄乱你的代码(因为你必须实现另一个适配器,从SuperUser继承,它将ECXATLY与其他类相同!)界面使用完全是为了解开,这就是我99%可能使用它们的主要原因,当然,如果选择取决于我.


yeg*_*256 11

Class Adapter是一种简单的旧式继承,可用于每种面向对象的语言,同时Object Adapter适配器设计模式的经典形式.

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