web-dev-qa-db-ja.com

アダプターパターン:クラスアダプターとオブジェクトアダプター

アダプタパターンについていくつか質問があります。クラスアダプタはアダプティから継承しますが、オブジェクトアダプタはアダプティを継承するのではなくオブジェクトとして持つことを理解しています。

オブジェクトアダプタではなくクラスアダプタを使用するのはいつですか。その逆も同様です。また、クラスアダプタを使用することのトレードオフとオブジェクトアダプタを使用することのトレードオフは何ですか?

31
Silverbolt

プログラミング言語に応じて、オブジェクトアダプタの利点が1つわかります。後者が多重継承(Javaなど)をサポートしておらず、複数のアダプタを一度に適応させたい場合は、次のことを行う必要があります。オブジェクトアダプタを使用します。

オブジェクトアダプタのもう1つのポイントは、すべてのパラメータ(アダプタの部分と、継承のためにアダプタをインスタンス化するとき)。このアプローチは私にはもっと柔軟に見えます。

23
Emmanuel

継承よりもコンポジションを使用することを好む

まず、ユーザーがいるとしましょう。

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; }
}

ここで、何らかの理由で、ユーザークラス用のアダプターが必要であると想像してください。次に、継承または複合による2つのアプローチがあります。

//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; } }
}

継承を使用すると、アダプタクラスを再利用できなくなり、コードが台無しになります(別のアダプタを実装する必要があるため、他のクラスと同じことをECXATLYで実行するSuperUserから継承します!!!)。 。インターフェイスの使用はすべてアンコッピングに関するものです。もちろん、選択が私次第である場合、99%がそれらを使用する可能性が高い主な理由です。

13
Renato Gama

Class Adapterは昔ながらの 継承 であり、すべてのオブジェクト指向言語で使用できますが、Object Adapterアダプタデザインパターン の古典的な形式です。

Object Adapter(したがってInheritance)と比較したClass Adapterの最大の利点は、クライアントと被適応者の 疎結合 です。

11
yegor256

クラスアダプタは、多重継承を使用して、あるインターフェイスを別のインターフェイスに適合させます:(プログラミング言語によって異なります:Java&C#は多重継承をサポートしていません) enter image description here

オブジェクトアダプタは、オブジェクトの構成によって異なります。 enter image description here

画像ソース:デザインパターン(再利用可能なオブジェクト指向ソフトウェアの要素)の本

4
K.Kirivarnan

renatoarghが彼の回答で述べたこと に加えてクラスアダプタの利点を追加したいと思います。

クラスアダプタでは、簡単にアダプティの動作を上書きする必要に応じて、サブクラス化それを行うことができます。そして、それはオブジェクトアダプタではより困難です。

ただし、オブジェクトアダプタの利点は、通常、クラスアダプタのこの小さな利点を上回ります。

  • class adapters特定のAdapterクラスにコミットすることでAdapteeをTargetに適応させると、クラスとそのサブクラスを適応させたい場合は機能しません。
  • オブジェクトアダプタ単一のアダプタを多くのアダプタ(アダプタとすべてのアダプタ階層)で機能させる
0
user3158958