C\#디자인 모드 프로 그래 밍 에서 어댑터 모드 구 조 를 활용 하여 실전 연습
어댑터 모델 의 디자인 사상 은 생활 에서 자주 응용 된다.예 를 들 어 우리 가 핸드폰 을 충전 할 때 220 V 전원 에서 직접 충전 할 수 없고 핸드폰 충전기 로 핸드폰 에 필요 한 전압 으로 전환 해 야 정상적으로 충전 할 수 있다.그렇지 않 으 면 충전 을 완성 하지 못 하고 이 충전 기 는 적당 한 역할 을 한다.
어댑터 모드 구조 구현
1.클래스 어댑터 구조 구현
ITarget.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Structural.ClassAdapter
{
public interface ITarget
{
void Request();
}
} Adaptee.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Structural.ClassAdapter
{
public class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("Called SpecificRequest()");
}
}
} Adapter.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Structural.ClassAdapter
{
public class Adapter : Adaptee, ITarget
{
public void Request()
{
this.SpecificRequest();
}
}
} Client.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Structural.ClassAdapter
{
public class Client
{
static void Main(string[] args)
{
ITarget t = new Adapter();
t.Request();
}
}
}
출력 실행:
Called SpecificRequest()
. . .
2.대상 어댑터 구조 구현Client 는 Request 방법 을 호출 해 야 합 니 다.Adaptee 는 이 방법 이 없습니다.Client 가 Adaptee 클래스 를 사용 할 수 있 도록 클래스 Adapter 를 제공 해 야 합 니 다.이 클래스 는 클 라 이언 트 와 Adaptee 를 연결 하 는 Adaptee 의 인 스 턴 스 를 포함 합 니 다.
ITarget.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
public interface ITarget
{
void Request();
}
}
Target.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
public class Target : ITarget
{
public virtual void Request()
{
Console.WriteLine("Called Target Request()");
}
}
}
Adaptee.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
public class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("Called SpecificRequest()");
}
}
}
Adapter.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
public class Adapter : Target
{
private Adaptee _adaptee = new Adaptee();
public override void Request()
{
_adaptee.SpecificRequest();
}
}
}
Client.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter
{
public class Client
{
static void Main(string[] args)
{
ITarget t = new Adapter();
t.Request();
}
}
}
어댑터 모드 실천 응용휴대 전화 충전 의 전원 어댑터 를 예 로 들 면 어댑터 모드 의 해결 방안 을 사용한다.
1.클래스 어댑터 구조 구현
ITarget.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Practical.ClassAdapter
{
public interface ITarget
{
void GetPower();
}
} Power.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Practical.ClassAdapter
{
public class Power
{
public void GetPower220V()
{
Console.WriteLine(" 220V ");
}
}
} Adapter.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Practical.ClassAdapter
{
public class Adapter : Power, ITarget
{
public void GetPower()
{
this.GetPower220V();
Console.WriteLine(" !");
}
}
} Client.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Practical.ClassAdapter
{
public class Client
{
static void Main(string[] args)
{
Console.WriteLine(" :");
ITarget t = new Adapter();
t.GetPower();
}
}
}
출력 실행:
:
220V
!
. . .
2.대상 어댑터 구조 구현ITarget.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Practical.ObjectAdapter
{
public interface ITarget
{
void GetPower();
}
}
Power.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Practical.ObjectAdapter
{
public class Power
{
public void GetPower220V()
{
Console.WriteLine(" 220V ");
}
}
}
Adapter.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Practical.ObjectAdapter
{
public class Adapter : ITarget
{
public Power _power;
public Adapter(Power power)
{
this._power = power;
}
/// <summary>
///
/// </summary>
public void GetPower()
{
_power.GetPower220V();
Console.WriteLine(" !");
}
}
}
Client.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DesignPatterns.AdapterPattern.Practical.ObjectAdapter
{
public class Client
{
static void Main(string[] args)
{
Console.WriteLine(" :");
ITarget t = new Adapter(new Power());
t.GetPower();
}
}
}
어댑터 모드 의 장단 점머리말 부분 에서 어댑터 모델 은 기 존의 대상 과 클 라 이언 트 가 기대 하 는 인터페이스 가 일치 하지 않 는 문 제 를 해결 하 는 데 사용 되 고 다음은 어댑터 두 가지 형식의 장단 점 을 상세 하 게 요약 한다.
1.클래스 어댑터 모드:
장점:
기 존 코드 를 수정 하지 않 은 토대 에서 기 존 종 류 를 재 활용 하여'개폐 원칙'에 잘 부합 할 수 있다.
어댑터 모드 에서 어댑터 는 어댑터 의 하위 클래스 이기 때문에 어댑터 의 일부 행 위 를 다시 정의 할 수 있 습 니 다.
하나의 대상 만 도입 하고 Adaptee 인 스 턴 스 를 추가 필드 로 참조 할 필요 가 없습니다.
단점:
하나의 구체 적 인 Adapter 클래스 로 Adaptee 와 Target 을 일치 시 킵 니 다.하나의 클래스 와 모든 하위 클래스 를 일치 시 키 려 면 클래스 의 어댑터 모드 를 감당 할 수 없습니다.클래스 어댑터 모드 에 Adaptee 의 인 스 턴 스 가 도입 되 지 않 았 기 때문에 this.specificRequest 방법 만 호출 하면 하위 클래스 의 SpecificRequest 방법 을 호출 할 수 없습니다.
'다 중 계승'의 실현 방식 을 채택 하여 불량한 고결 합 을 가 져 왔 다.
2.대상 의 어댑터 모드
장점:
기 존 코드 를 수정 하지 않 은 토대 에서 기 존 클래스 를 재 활용 하여'개폐 원칙'에 잘 부합 할 수 있 습 니 다.(이 점 은 두 가지 실현 방식 이 모두 가지 고 있 습 니 다)
'대상 조합'방식 을 사용 하여 소나무 결합 에 더욱 부합된다.
단점:
Adaptee 의 행동 을 다시 정의 하 는 것 이 어렵 습 니 다.이 는 Adaptee 의 하위 클래스 를 생 성하 고 Adapter 가 Adaptee 자 체 를 참조 하 는 것 이 아니 라 이 하위 클래스 를 참조 하도록 해 야 합 니 다.
필드 사용
다음 상황 에서 어댑터 모드 사용 을 고려 할 수 있 습 니 다.
시스템 은 기 존 클래스 를 재 활용 해 야 하 며,이러한 인 터 페 이 스 는 시스템 의 수요 에 부합 되 지 않 는 다.
중복 사용 가능 한 종 류 를 만 들 려 면 서로 에 게 큰 관련 이 없 는 종 류 를 만 들 려 고 합 니 다.앞으로 도 입 될 수 있 는 종 류 를 포함 하여 함께 일 할 수 있 습 니 다.
대상 어댑터 모드 에 대해 디자인 에서 기 존 하위 클래스 의 인 터 페 이 스 를 여러 개 바 꿔 야 합 니 다.만약 에 클래스 의 어댑터 모드 를 사용한다 면 각 하위 클래스 에 대해 어댑터 를 만들어 야 합 니 다.이것 은 현실 적 이지 않 습 니 다.
.NET 어댑터 모드 구현
1.어댑터 모드 가.NET Framework 에서 가장 큰 응용 은 COM Interop 이다.COM Interop 은 COM 과.NET 사이 의 교량 인 것 같다.COM 구성 요소 대상 은.NET 클래스 대상 과 는 완전히 다 르 지만.NET 프로그램 이.NET 대상 을 사용 하 는 것 처럼 COM 구성 요 소 를 사용 하도록 하기 위해 MS 는 처리 방식 에 Adapter 모드 를 적용 해 COM 대상 을 포장 하 는데,이 포장 클래스 가 RCW(Runtime Callable Wrapper)다.RCW 는 실제로 runtime 에서 생 성 된.NET 클래스 로 COM 구성 요소 의 방법 을 포장 하고 내부 적 으로 COM 구성 요소 에 대한 호출 을 실현 합 니 다.다음 그림 에서 보 듯 이:
2..NET 의 또 다른 어댑터 모드 의 응용 은 바로 DataAdapter 이다.ADO.NET 은 통 일 된 데이터 접근 에 여러 개의 인터페이스 와 기본 클래스 를 제공 하 는데 그 중에서 가장 중요 한 인터페이스 중 하 나 는 IdataAdapter 이다.DataAdpter 는 데이터 베 이 스 를 DataSet 브리지 에 연결 하 는 역할 을 하여 프로그램의 데이터 조작 을 DataSet 에 통일 시 키 고 구체 적 인 데이터 베이스 유형 과 무관 하 게 합 니 다.심지어 특수 한 데이터 원본 에 대해 자신의 DataAdpter 를 작성 하여 우리 의 응용 프로그램 이 이러한 특수 한 데이터 원본 과 호 환 되도록 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.