C# Language
구조 디자인 패턴
수색…
소개
구조 디자인 패턴은 개체와 클래스를 결합하여 큰 구조를 형성하는 방법을 설명하고 엔터티 간의 관계를 실현하는 간단한 방법을 식별하여 디자인을 쉽게하는 패턴입니다. 설명 된 7 가지 구조 패턴이 있습니다. 그들은 다음과 같습니다 : 어댑터, 다리, 합성물, 데코레이터, 외관, 플라이급 및 프록시
어댑터 디자인 패턴
이름에서 알 수 있듯이 "어댑터" 는 서로 호환되지 않는 두 개의 인터페이스가 서로 통신 할 수있게하는 객체입니다.
예를 들면 : 아이폰 8 (또는 다른 애플 제품)을 사면 많은 어댑터가 필요하다. 기본 인터페이스는 오디오 jac 또는 USB를 지원하지 않기 때문입니다. 이러한 어댑터를 사용하면 이어폰을 전선과 함께 사용하거나 일반 이더넷 케이블을 사용할 수 있습니다. 따라서 "서로 호환되지 않는 두 인터페이스가 서로 통신합니다" .
기술적 측면에서 이것은 다음을 의미합니다 : 클래스의 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 변환하십시오. 어댑터는 호환되지 않는 인터페이스 때문에 달리 작동 할 수없는 클래스를 함께 작동시킵니다. 이 패턴에 참여하는 클래스와 객체는 다음과 같습니다.
어댑터 패턴은 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();
}
}
두 번째 코드 예제 (실제 세계 구현)
/// <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는 어댑터 패턴의 가장 좋은 예입니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow