C# Language
構造設計パターン
サーチ…
前書き
構造設計パターンは、オブジェクトとクラスがどのように結合され、大きな構造を形成するかを記述し、エンティティ間の関係を実現する簡単な方法を特定することによって設計を容易にするパターンです。 7つの構造パターンが記述されています。彼らは次のとおりです:アダプタ、ブリッジ、コンポジット、デコレータ、ファサード、フライウェイト、プロキシ
アダプタ設計パターン
名前として「アダプタ」が示唆しているのは、相互に互換性のない2つのインターフェイスが相互に通信できるようにするオブジェクトです。
たとえば 、あなたがIphone 8(または他のApple製品)を購入する場合は、多くのアダプタが必要です。デフォルトのインターフェイスはオーディオjacまたはUSBをサポートしていないためです。これらのアダプタでは、イヤホンをワイヤで使用することができます。また、通常のイーサネットケーブルを使用することもできます。したがって、 「相互に互換性のない2つのインターフェイスは相互に通信します」 。
つまり、技術的には、次のことを意味します。クラスのインターフェースを、クライアントが期待する別のインターフェースに変換する。アダプターは、互換性のないインターフェースのためにクラスが一緒に動作することを可能にします。このパターンに関与するクラスとオブジェクトは次のとおりです。
アダプターパターンは、4つの要素
- ITarget:これは、クライアントが機能を達成するために使用するインターフェイスです。
- Adaptee:これは、クライアントが望む機能ですが、そのインタフェースはクライアントと互換性がありません。
- クライアント:これは、アダプターのコードを使用していくつかの機能を達成したいクラスです。
- アダプタ: ITargetを実装するクラスであり、クライアントが呼びたいAdapteeコードを呼び出します。
UML
最初のコードの例(理論的な例) 。
public interface ITarget
{
void MethodA();
}
public class Adaptee
{
public void MethodB()
{
Console.WriteLine("MethodB() is called");
}
}
public class Client
{
private ITarget target;
public Client(ITarget target)
{
this.target = target;
}
public void MakeRequest()
{
target.MethodA();
}
}
public class Adapter : Adaptee, ITarget
{
public void MethodA()
{
MethodB();
}
}
2番目のコード例(現実世界の実装)
/// <summary>
/// Interface: This is the interface which is used by the client to achieve functionality.
/// </summary>
public interface ITarget
{
List<string> GetEmployeeList();
}
/// <summary>
/// Adaptee: This is the functionality which the client desires but its interface is not compatible with the client.
/// </summary>
public class CompanyEmplyees
{
public string[][] GetEmployees()
{
string[][] employees = new string[4][];
employees[0] = new string[] { "100", "Deepak", "Team Leader" };
employees[1] = new string[] { "101", "Rohit", "Developer" };
employees[2] = new string[] { "102", "Gautam", "Developer" };
employees[3] = new string[] { "103", "Dev", "Tester" };
return employees;
}
}
/// <summary>
/// Client: This is the class which wants to achieve some functionality by using the adaptee’s code (list of employees).
/// </summary>
public class ThirdPartyBillingSystem
{
/*
* This class is from a thirt party and you do'n have any control over it.
* But it requires a Emplyee list to do its work
*/
private ITarget employeeSource;
public ThirdPartyBillingSystem(ITarget employeeSource)
{
this.employeeSource = employeeSource;
}
public void ShowEmployeeList()
{
// call the clietn list in the interface
List<string> employee = employeeSource.GetEmployeeList();
Console.WriteLine("######### Employee List ##########");
foreach (var item in employee)
{
Console.Write(item);
}
}
}
/// <summary>
/// Adapter: This is the class which would implement ITarget and would call the Adaptee code which the client wants to call.
/// </summary>
public class EmployeeAdapter : CompanyEmplyees, ITarget
{
public List<string> GetEmployeeList()
{
List<string> employeeList = new List<string>();
string[][] employees = GetEmployees();
foreach (string[] employee in employees)
{
employeeList.Add(employee[0]);
employeeList.Add(",");
employeeList.Add(employee[1]);
employeeList.Add(",");
employeeList.Add(employee[2]);
employeeList.Add("\n");
}
return employeeList;
}
}
///
/// Demo
///
class Programs
{
static void Main(string[] args)
{
ITarget Itarget = new EmployeeAdapter();
ThirdPartyBillingSystem client = new ThirdPartyBillingSystem(Itarget);
client.ShowEmployeeList();
Console.ReadKey();
}
}
いつ使用するか
- システムが、それと互換性のない別のシステムのクラスを使用することを許可する。
- 相互に独立した新規システムと既存システムとの間の通信を可能にする
- Ado.Net SqlAdapter、OracleAdapter、MySqlAdapterは、Adapter Patternの最良の例です。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow