C\#디자인 모드 프로 그래 밍 에서 어댑터 모드 구 조 를 활용 하여 실전 연습

10144 단어 C#어댑터 모드
실제 소프트웨어 시스템 디자인 과 개발 에서 특정한 업 무 를 완성 하기 위해 제3자 의 라 이브 러 리 를 구 매 하여 개발 을 가속 화해 야 한다.이것 은 응용 프로그램 에서 이미 설 계 된 기능 인터페이스 가 이 제3자 가 제공 하 는 인터페이스 와 일치 하지 않 는 다 는 문 제 를 가 져 왔 다.이러한 인터페이스 가 호 환 되 지 않 는 클래스 가 함께 작업 할 수 있 도록 어댑터 모드 는 인터페이스의 어댑터 메커니즘 을 제공 했다.
어댑터 모델 의 디자인 사상 은 생활 에서 자주 응용 된다.예 를 들 어 우리 가 핸드폰 을 충전 할 때 220 V 전원 에서 직접 충전 할 수 없고 핸드폰 충전기 로 핸드폰 에 필요 한 전압 으로 전환 해 야 정상적으로 충전 할 수 있다.그렇지 않 으 면 충전 을 완성 하지 못 하고 이 충전 기 는 적당 한 역할 을 한다.
어댑터 모드 구조 구현
1.클래스 어댑터 구조 구현
2016217155956456.png (367×596)
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();
  }
 }
}

어댑터 모드 실천 응용
휴대 전화 충전 의 전원 어댑터 를 예 로 들 면 어댑터 모드 의 해결 방안 을 사용한다.
2016217160138027.png (367×596)
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 구성 요소 에 대한 호출 을 실현 합 니 다.다음 그림 에서 보 듯 이:
2016217160319899.png (784×333)
2..NET 의 또 다른 어댑터 모드 의 응용 은 바로 DataAdapter 이다.ADO.NET 은 통 일 된 데이터 접근 에 여러 개의 인터페이스 와 기본 클래스 를 제공 하 는데 그 중에서 가장 중요 한 인터페이스 중 하 나 는 IdataAdapter 이다.DataAdpter 는 데이터 베 이 스 를 DataSet 브리지 에 연결 하 는 역할 을 하여 프로그램의 데이터 조작 을 DataSet 에 통일 시 키 고 구체 적 인 데이터 베이스 유형 과 무관 하 게 합 니 다.심지어 특수 한 데이터 원본 에 대해 자신의 DataAdpter 를 작성 하여 우리 의 응용 프로그램 이 이러한 특수 한 데이터 원본 과 호 환 되도록 할 수 있다.

좋은 웹페이지 즐겨찾기