アダプタパターンについていくつか質問があります。クラスアダプタはアダプティから継承しますが、オブジェクトアダプタはアダプティを継承するのではなくオブジェクトとして持つことを理解しています。
オブジェクトアダプタではなくクラスアダプタを使用するのはいつですか。その逆も同様です。また、クラスアダプタを使用することのトレードオフとオブジェクトアダプタを使用することのトレードオフは何ですか?
プログラミング言語に応じて、オブジェクトアダプタの利点が1つわかります。後者が多重継承(Javaなど)をサポートしておらず、複数のアダプタを一度に適応させたい場合は、次のことを行う必要があります。オブジェクトアダプタを使用します。
オブジェクトアダプタのもう1つのポイントは、すべてのパラメータ(アダプタの部分と、継承のためにアダプタをインスタンス化するとき)。このアプローチは私にはもっと柔軟に見えます。
継承よりもコンポジションを使用することを好む
まず、ユーザーがいるとしましょう。
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%がそれらを使用する可能性が高い主な理由です。
Class Adapter
は昔ながらの 継承 であり、すべてのオブジェクト指向言語で使用できますが、Object Adapter
は アダプタデザインパターン の古典的な形式です。
Object Adapter
(したがってInheritance
)と比較したClass Adapter
の最大の利点は、クライアントと被適応者の 疎結合 です。
クラスアダプタは、多重継承を使用して、あるインターフェイスを別のインターフェイスに適合させます:(プログラミング言語によって異なります:Java&C#は多重継承をサポートしていません)
オブジェクトアダプタは、オブジェクトの構成によって異なります。
画像ソース:デザインパターン(再利用可能なオブジェクト指向ソフトウェアの要素)の本
renatoarghが彼の回答で述べたこと に加えてクラスアダプタの利点を追加したいと思います。
クラスアダプタでは、簡単にアダプティの動作を上書きする必要に応じて、サブクラス化それを行うことができます。そして、それはオブジェクトアダプタではより困難です。
ただし、オブジェクトアダプタの利点は、通常、クラスアダプタのこの小さな利点を上回ります。