디자인 패턴: 어댑터. 구조 템플릿: Java의 어댑터용 Adapter Ready 코드

    어댑터(디자인 패턴)/코드 예제- 주요 기사: 어댑터(디자인 패턴) 시스템을 사용하는 C#의 패턴 구현 예; 네임스페이스 어댑터( 클래스 MainApp( static void Main() ( ... Wikipedia

    프록시 패턴(디자인 패턴)

    디자인 패턴- 이 용어에는 다른 의미도 있습니다. 패턴을 참조하세요. 소프트웨어 개발에서 디자인 패턴은 문제에 대한 해결책을 나타내는 반복 가능한 아키텍처 디자인입니다... ... Wikipedia

    인터페이스(디자인 패턴)- 디자인 패턴 상호 작용디자인 패턴에 설명됨 아니요 컴퓨터 과학에서 인터페이스 패턴은 디자인 패턴 중 특별한 패턴이 아닙니다. 일반적인 구조화 방법이다. 컴퓨터 프로그램그러기 위해서... 위키피디아

    차장 (디자인 패턴)- Proxy 패턴(Deputy) 디자인 패턴입니다. 액세스 제어 개체를 제공하여 해당 개체에 대한 모든 호출을 차단합니다. 목차 1 목표 1.1 문제 1.2 해결책 2 장점 3 ... Wikipedia

    가디언(디자인 패턴)- 디자인 패턴 Guardian Memento 유형: 동작 디자인 패턴에 설명됨 예 Guardian(Memento, Token, Token이라고도 함)은 동작 디자인 패턴입니다. 캡슐화를 깨지 않고 문제를 해결할 수 있습니다... Wikipedia

    반복자(디자인 패턴)- 디자인 패턴 반복자 반복자 유형: 동작 디자인 패턴에 설명됨 예 반복자 패턴(커서라고도 함) 동작 패턴을 참조하는 디자인 패턴입니다. 그것은 당신이 얻을 수 있는 객체입니다 ... Wikipedia

    통역사(디자인 패턴)- 디자인 패턴 인터프리터 유형: 행동 목적: 자주 발생하고 변경되기 쉬운 문제를 해결합니다. 디자인 패턴에 설명되어 있음 예 인터프리터 패턴(영어 ... Wikipedia

    링커(디자인 패턴)- 디자인 패턴 복합 유형: 구조적 디자인 패턴에 설명됨 예 복합 패턴은 디자인 패턴이며 구조적 패턴을 의미하며 객체를 결합합니다 ... Wikipedia

    상태(디자인 패턴)- 상태 디자인 패턴 유형: 동작 디자인 패턴에 설명됨 예 상태는 디자인 패턴입니다. 프로그램 실행 중에 객체가 ... Wikipedia

    주요 기사: 어댑터(디자인 패턴) 시스템을 사용하여 C#에서 패턴 구현 예; 네임스페이스 어댑터( 클래스 MainApp( static void Main() ( ... Wikipedia

    이 용어에는 다른 의미도 있습니다. 패턴을 참조하세요. 소프트웨어 개발에서 디자인 패턴은 문제에 대한 해결책을 나타내는 반복 가능한 아키텍처 디자인입니다... ... Wikipedia

    인터페이스 디자인 패턴 디자인 패턴에 설명된 인터페이스 아니요 컴퓨터 과학에서 인터페이스 패턴은 디자인 패턴 중 특별한 패턴이 아닙니다. 이는 컴퓨터 프로그램을 구조화하는 일반적인 방법입니다... Wikipedia

    프록시 패턴 디자인 패턴. 액세스 제어 개체를 제공하여 해당 개체에 대한 모든 호출을 차단합니다. 목차 1 목표 1.1 문제 1.2 해결책 2 장점 3 ... Wikipedia

    디자인 패턴 Guardian Memento 유형: 동작 디자인 패턴에 설명됨 예 Guardian(Memento, Token, Token이라고도 함)은 동작 디자인 패턴입니다. 캡슐화를 깨지 않고 문제를 해결할 수 있습니다... Wikipedia

    디자인 패턴 반복자 반복자 유형: 동작 디자인 패턴에 설명됨 예 반복자 패턴(커서라고도 함) 동작 패턴을 참조하는 디자인 패턴입니다. 그것은 당신이 얻을 수 있는 객체입니다 ... Wikipedia

    디자인 패턴 인터프리터 유형: 행동 목적: 자주 발생하고 변경되기 쉬운 문제를 해결합니다. 디자인 패턴에 설명되어 있습니다. 예 인터프리터 패턴(영어 ... Wikipedia

    디자인 패턴 복합 유형: 구조적 디자인 패턴에 설명됨 예 복합 패턴은 디자인 패턴이며 구조적 패턴을 나타내며 객체를 결합합니다 ... Wikipedia

    디자인 패턴 상태 유형: 동작 디자인 패턴에 설명됨 예 상태는 디자인 패턴입니다. 프로그램 실행 중에 객체가 ... Wikipedia

읽기 전에 다음 규칙과 개념을 검토하십시오. 이 글은 일정한 빈도로 업데이트되므로, 이전에 읽어보셨다면 데이터가 변경되지 않았다는 것은 사실이 아닙니다.

어댑터클래스에 속한다 구조적패턴. 하나의 인터페이스를 클라이언트가 요구하는 다른 인터페이스로 변환하는 데 사용됩니다. 어댑터는 계층을 구현하여 호환되지 않는 인터페이스의 호환성을 보장합니다.

작동 원리

어댑터는 개방형 방식으로 대상 인터페이스를 상속합니다. 표적) 및 폐쇄형 적응형 인터페이스( 적응자). 대상 인터페이스 메서드 구현에서 요청은 적응형 인터페이스가 있는 클래스로 리디렉션(위임)됩니다.

// 타겟 인터페이스, 클라이언트는 그것으로만 작업할 수 있습니다. 인터페이스 iTarget ( public function query(); ) // 적응 가능한 인터페이스. 클라이언트는 작업 방법을 모르지만 iAdaptee 인터페이스를 원합니다( public function request(); ) // 적응 가능한 인터페이스를 구현하는 클래스 class Adaptee는 iAdaptee를 구현합니다( public function request() ( return __CLASS__ . ":: " . __METHOD__; ) ) 클래스 Adapter는 iTarget을 구현합니다( protected $adaptee = null; 공용 함수 __construct()( $this ->adapee = new Adaptee(); ) 공용 함수 query()( return $this ->adapee -> request) (); ) ) $ 대상 = 새 어댑터(); $Target 인쇄 -> 쿼리(); // "적응자::요청"

결론

어댑터는 여러 인터페이스를 한 번에 하나의 인터페이스로 조정할 수 있습니다. 이 패턴을 호출합니다. 객체 어댑터이 패턴의 사용은 여러 경우에 정당화됩니다. 다른 인터페이스로 기존 클래스를 사용하려는 경우. 여러 장소에서 적응형 인터페이스를 사용할 계획이고 모든 곳에서 동일하게 보이도록 만들 기회가 없다면 교체 가능한 어댑터를 사용하는 것이 좋습니다.

어댑터 패턴의 목적

종종 새로운 소프트웨어 프로젝트기존 코드를 재사용할 수 없습니다. 예를 들어 기존 클래스에 원하는 기능이 있지만 인터페이스가 호환되지 않을 수 있습니다. 이러한 경우에는 Adapter 패턴을 사용해야 합니다.

기존 클래스에 대한 소프트웨어 래퍼인 어댑터 패턴은 해당 인터페이스를 후속 사용에 적합한 형식으로 변환합니다.

Adapter 패턴을 사용해야 하는 경우에 대한 간단한 예를 살펴보겠습니다. 주변 온도를 지정된 한계 내에서 자동으로 유지하도록 설계된 기후 제어 시스템을 개발해 보겠습니다. 중요한 구성 요소이러한 시스템은 후속 분석을 위해 주변 온도를 측정하는 온도 센서입니다. 이 센서에는 이미 기성품이 있습니다. 소프트웨어적절한 인터페이스를 갖춘 클래스인 타사 개발자의 것입니다. 그러나 센서 판독값은 화씨 단위로 표시되므로 이 클래스를 직접 사용할 수 없습니다. 온도를 섭씨로 변환하는 어댑터가 필요합니다.

표준 STL 템플릿 라이브러리의 큐, 우선순위_큐 및 스택 컨테이너는 순차 목록, 데크 및 벡터 컨테이너를 기반으로 구현되어 해당 인터페이스를 원하는 형식에 맞게 조정합니다. 이것이 바로 이러한 컨테이너를 어댑터 컨테이너라고 부르는 이유입니다.

어댑터 패턴 설명

원하는 형식에 맞게 인터페이스를 조정해야 하는 클래스의 이름을 Adaptee로 지정합니다. 인터페이스 변환 문제를 해결하기 위해 어댑터 패턴은 다음과 같은 클래스 계층 구조를 도입합니다.

  • 대상 가상 기본 클래스입니다. 여기에 발표 사용자 인터페이스적합한 유형. 사용자는 이 인터페이스만 사용할 수 있습니다.
  • Target 인터페이스를 구현하는 Adapter의 파생 클래스입니다. 이 클래스에는 Adaptee 인스턴스에 대한 포인터나 참조도 포함되어 있습니다. Adapter 패턴은 이 포인터를 사용하여 클라이언트 호출을 Adaptee로 전달합니다. Adaptee와 Target 인터페이스는 서로 호환되지 않으므로 일반적으로 이러한 호출에는 변환이 필요합니다.

어댑터 패턴 구현

어댑터 패턴의 클래식 구현

다음은 어댑터 패턴의 구현입니다. 위의 예에서는 실내 온도 조절 시스템의 온도 센서 판독값을 화씨에서 섭씨로 변환하여 조정합니다(이 센서의 코드는 수정할 수 없다고 가정합니다).

#포함하다 // 이미 존재하는 환경 온도 센서 클래스 class FahrenheitSensor ( public: // 화씨 온도 판독값 가져오기 float getFahrenheitTemp() ( float t = 32.0; // ... 일부 코드 return t; ) ); 클래스 센서( public: virtual ~Sensor() () virtual float getTemperature() = 0; ); class Adapter: public Sensor ( public: Adapter(FahrenheitSensor* p) : p_fsensor(p) ( ) ~Adapter() ( p_fsensor 삭제; ) float getTemperature() ( return (p_fsensor->getFahrenheitTemp()-32.0)*5.0/9.0 ; ) 비공개: FahrenheitSensor* p_fsensor; ); int main() ( 센서* p = new Adapter(new FahrenheitSensor); cout<< "Celsius temperature = " << p->get온도()<< endl; delete p; return 0; }

폐쇄형 상속 기반 어댑터 ​​패턴 구현

당사의 실내 온도 조절 시스템 온도 센서가 보다 정확한 판독을 위해 조정 기능을 지원하도록 하십시오. 이 함수를 반드시 사용해야 하는 것은 아니며, 이는 개발자가 기존 FahrenheitSensor 클래스에서 해당 adjust() 메서드를 보호한다고 선언한 이유일 것입니다.

우리가 개발하는 시스템은 측정 사용자 정의를 지원해야 합니다. 포인터나 링크를 통한 보호된 메서드에 대한 액세스는 금지되어 있으므로 여기서는 어댑터 패턴의 고전적인 구현이 더 이상 적합하지 않습니다. 유일한 해결책은 FahrenheitSensor 클래스에서 상속하는 것입니다. 이 클래스의 인터페이스는 사용자가 액세스할 수 없는 상태로 유지되어야 하므로 상속은 비공개여야 합니다.

개방형 상속과 폐쇄형 상속을 사용할 때 추구하는 목표는 다릅니다. 개방형 상속은 인터페이스 및 구현 상속에 사용되는 반면, 폐쇄 상속은 구현 상속에만 사용됩니다.

#포함하다 class FahrenheitSensor ( public: float getFahrenheitTemp() ( float t = 32.0; // ... return t; ) protected: void adjust() () // 센서 조정(보호된 메서드) ); 클래스 센서( 공개: virtual ~Sensor() () virtual float getTemperature() = 0; virtual void adjust() = 0; ); 클래스 어댑터: 공용 센서, 개인 FahrenheitSensor ( 공용: Adapter() ( ) float getTemperature() ( return (getFahrenheitTemp()-32.0)*5.0/9.0; ) void adjust() ( FahrenheitSensor::adjust(); ) ); int main() ( 센서 * p = new Adapter(); p->adjust(); cout<< "Celsius temperature = " << p->get온도()<< endl; delete p; return 0; }

Adapter 패턴 적용 결과

어댑터 패턴의 장점

  • 어댑터 패턴을 사용하면 호환되지 않는 인터페이스를 사용 가능한 형식으로 조정하여 기존 코드를 재사용할 수 있습니다.

어댑터 패턴의 단점

  • 클라이언트 호출 및/또는 전달된 매개변수가 조정되는 개체와 기능적으로 일치하지 않는 경우 인터페이스 변환 작업이 어려울 수 있습니다.

안녕하세요 여러분! 오늘 우리는 패턴 어댑터 디자인 패턴. 이름에서 알 수 있듯이 무언가를 보장하는 역할을 합니다. 적응하다, 근데 뭐? 그리고 이 기사는 이 질문에 대한 답을 제공할 것입니다.

어댑터 디자인 패턴에 대한 설명

프로그래밍에서 조금 벗어나서 살펴보겠습니다. 어댑터현실에서. 예를 들어, 해외에서 일부 장비(예: 컴퓨터)를 구입했습니다. 집에 도착했을 때 다른 표준의 플러그가 러시아 콘센트에 맞지 않는다는 것을 발견했습니다. 무엇을 해야 할까요? 오른쪽! 매장에 가셔서 구매하셔야해요 어댑터, 이를 사용하여 컴퓨터를 네트워크에 연결할 수 있습니다. 그래서 이건 어댑터그리고 거기에 어댑터. 외부 플러그를 삽입하고 어댑터 자체를 네트워크에 연결하면 모든 것이 잘 작동합니다. 저것들. 그것은 단순히 제공됩니다 우리 소켓과 외국 플러그 사이.

그래서 내 생각엔 당신이 그걸 알아낸 것 같아요 어댑터가 뭐야?인생에서. 프로그래밍에서도 마찬가지입니다.

PHP의 어댑터 구현 예

인터페이스 iMain(
공개 함수 send();
}

인터페이스 iAdaptee(
공개함수 조회();
}

클래스 Adaptee는 iAdaptee(
공개 함수 조회() (
__CLASS__."::".__METHOD__를 반환합니다.
}
}

클래스 어댑터는 iMain(
보호된 $adaptee = null;

공용 함수 __construct() (
$this->adaptee = 새로운 Adaptee();
}

공개 함수 send() (
return $this->adaptee->inquiry();
}
}

$goal = 새로운 어댑터();
echo $goal->send(); // "적응자::문의"
?>

여기에 우리의 코드가 있습니다. 그것을 알아 봅시다. 인터페이스가 있습니다 아이메인, 클라이언트 코드가 작동할 수 있습니다. 다음으로 인터페이스가 있습니다. iAdaptee, 클라이언트 코드에서는 작동할 수 없지만 어떻게든 상호 작용해야 합니다. 그럼 우리 수업이 있어요 적응자 iAdaptee그 안에는 다음과 같은 메서드가 있습니다. 문의, 이는 단순히 다음과 같은 문자열을 반환합니다. 클래스::메소드. 여기 수업 들으러 왔어요 어댑터, 인터페이스를 상속받습니다. 아이메인. 그 안에 보호 속성을 만듭니다. 적응자, 동일한 없는. 다음으로 생성자에서 클래스 객체를 생성합니다. 적응자우리의 보호 재산에 기록하세요. 방법에서 보내다메소드 호출을 반환합니다. 문의.

그게 다야. 이제 어댑터 객체를 생성하고 메소드를 호출합니다. 보내다.

저것들. 요점은 하나의 인터페이스로는 작업할 수 있지만 다른 인터페이스로는 작업할 수 없다는 것입니다. 그리고 우리가 액세스할 수 없는 이 인터페이스와 어떻게든 상호 작용하기 위해 어댑터, 작업을 구현하는 레이어입니다.

결론

이제 모든 것이 매우 복잡하고 어려워 보일 수도 있지만 그렇지 않습니다. 어댑터의 의미를 이해하신 것 같지만 이제 더 많은 연습이 필요합니다. 이 기사에 제공된 코드를 다시 살펴보고 이해해 보세요. 한 줄 한 줄 읽어보고 통역사처럼 암송하세요 PHP. 또한, 이 템플릿이 꽤 자주 사용되기 때문에 일부 프레임워크의 코드를 살펴보는 것이 좋습니다.

이것으로 꽤 긴 글을 마치겠습니다. 관심을 가져주셔서 감사합니다!