>  기사  >  백엔드 개발  >  한 기사에서 PHP의 어댑터 패턴에 대해 알아보세요.

한 기사에서 PHP의 어댑터 패턴에 대해 알아보세요.

青灯夜游
青灯夜游앞으로
2021-06-29 19:12:473569검색

이전 기사 "A Brief Talk on the Decorator Pattern in PHP"에서 PHP의 데코레이터 패턴을 소개했습니다. 이 기사에서는 PHP의 어댑터 패턴을 이해하는 데 도움이 됩니다.

한 기사에서 PHP의 어댑터 패턴에 대해 알아보세요.

이 모델에는 항상 매우 고전적인 예가 있었는데 바로 소켓입니다! 맞습니다. 해외에서 가전제품을 구매하거나 해외 출장을 갈 때, 우리나라의 전압 규격은 220V인 반면 다른 나라의 전압 규격은 110V이기 때문에 전원 어댑터가 필요한 경우가 많습니다. 그리고 이 전원 어댑터는 어댑터 모드의 상징입니다. 개체가 요구 사항을 충족하지 않으면 어댑터를 추가하세요! !

Gof 클래스 다이어그램 및 설명

GoF 정의: 클래스의 인터페이스를 고객이 원하는 다른 인터페이스로 변환합니다. Adapter 패턴을 사용하면 호환되지 않는 인터페이스로 인해 원래 함께 작동할 수 없었던 클래스가 함께 작동할 수 있습니다.

GoF 클래스 다이어그램:

Inherited

한 기사에서 PHP의 어댑터 패턴에 대해 알아보세요.Combined

한 기사에서 PHP의 어댑터 패턴에 대해 알아보세요.

코드 구현

interface Target{
    function Request() : void;
}
구현 메서드가 있는 일반 클래스일 수도 있는 인터페이스 계약을 정의합니다(다음 예제에서는 클래스를 사용합니다)

class Adapter implements Target{
    private $adaptee;

    function __constuct($adaptee){
        $this->adaptee = $adaptee;
    }

    function Request() : void {
        $this->adaptee->SpecificRequest();
    }
}

어댑터는 Request() 메서드를 구현할 수 있도록 이 인터페이스 계약을 구현합니다. 실제로 call은 Adaptee 클래스의 메소드입니다

class Adaptee {
    function SpecificRequest() : void{
        echo "I'm China Standard!";
    }
}

어댑터는 두 가지 형태로 제공됩니다. 위의 클래스 다이어그램에 표시된 것처럼 우리 코드에서 구현된
  • 상속 양식의 결합된 형태는 GoF 책에서 C++로 예시되어 있습니다. C++에서는 다중 상속을 구현할 수 있기 때문에 대부분의 대중적인 언어는 인터페이스 형태로 구현도 가능하지만 이 형태를 사용하는 어댑터는 사실 아직까지 많지 않습니다. 데코레이터 사용과 유사한 인터페이스 지향 프로그래밍을 위해 여기에서 이전 함수의 패키징을 직접 교체했지만 외부 호출은 동일하게 유지됩니다.
  • 어댑터 모드는 실제로 이해하기 쉽습니다. 코드에는 실제로 이 정도만 있습니다.
  • 제 휴대폰 공장 얘기를 다시 해보자면, 이번에 저희 사업이 정말 많이 성장했어요! 태국, 싱가폴, 인도네시아에도 판매되고 있어요. 어쨌든 카레가 있는 곳이라면 어디든 찾아볼 수 있어요. 카레색깔을 생산했다고 하네요. 껍데기의 변화가 전적으로 노아의 영향으로 인한 것은 아니지만 장기간의 연구 끝에 우리는 다른 색상이 다른 장소에서 더 잘 팔리는 것을 발견했습니다. 따라서 Foxconn에서는 원래 휴대폰 케이스 생산 라인(Target)에 스프레이 어댑터(어댑터)를 설치했습니다. 다른 색상의 케이스가 필요한 경우 다른 페인트(어댑터)를 변경하기 위해 이 어댑터만 있으면 이 스프레이어를 직접 설치할 수 있습니다. 새로운 컬러의 휴대폰이 탄생합니다. 다른 나라로 사업 확장할 때 페인트만 바꾸면 됩니다. 시간이 너무 오래 걸리면 노즐도 교체해 드립니다(연속 프린터 기억하세요)

풀 코드: 어댑터 모드

https:/ /github .com/zhangyue0503/designpatterns-php/blob/master/05.adapter/source/adapter.php

Example

언제 컴파일할 수 있는지 계속 문자 보내주세요~~모두들 접속시 정보 및 결제 인터페이스에는 이러한 플랫폼에서 제공하는 SDK가 자주 사용됩니다. 특히 Composer를 사용하면 SDK를 설치하는 것이 더 편리합니다. 그러나 이들 사람들이 만든 SDK는 비슷한 기능을 가지고 있음에도 불구하고 이름이 매우 다릅니다! ! 우리 시스템은 항상 Alibaba Cloud의 서비스를 사용해 왔지만 이번에는 Jiguang 및 Baidu Cloud의 정보 기능을 추가해야 합니다. 먼저 백업으로, 두 번째로 보안이나 경제적 목적을 달성하기 위해 다양한 서비스에 따라 다양한 인터페이스를 사용해야 합니다. SDK를 사용할 때 매우 편리하고 모든 사람이 이미 익숙한 Alibaba Cloud 인터페이스와 동일할 수 있도록 외부 인터페이스를 통합할 방법은 없나요? 물론 각각에 어댑터를 제공하면 됩니다. 인스턴스화할 때 다른 어댑터를 반환하도록 외부 팩토리를 설정하기만 하면 됩니다. 어댑터의 구현 방법이 Alibaba Cloud와 동일하다면 괜찮습니다!

SMS 전송 클래스 다이어그램

전체 소스 코드: SMS 전송 어댑터 방법한 기사에서 PHP의 어댑터 패턴에 대해 알아보세요.

https://github.com/zhangyue0503/designpatterns-php/blob/master/05.adapter/source/adapter- 메시지 .php

<?php

class Message{
    public function send(){
        echo "阿里云发送短信!" . PHP_EOL;
    }
    public function push(){
        echo "阿里云发送推送!" . PHP_EOL;
    }
}

class JiguangSDKAdapter extends Message{
    private $message;

    public function __construct($message){
        $this->message = $message;
    }

    public function send(){
        $this->message->send_out_msg();
    }
    public function push(){
        $this->message->push_msg();
    }
}

class JiguangMessage{
    public function send_out_msg(){
        echo "极光发送短信!" . PHP_EOL;
    }
    public function push_msg(){
        echo "极光发送推送!" . PHP_EOL;
    }
}
class BaiduYunSDKAdapter extends Message{
    private $message;

    public function __construct($message){
        $this->message = $message;
    }

    public function send(){
        $this->message->transmission_msg();
    }
    public function push(){
        $this->message->transmission_push();
    }
}
class BaiduYunMessage{
    public function transmission_msg(){
        echo "百度云发送短信!" . PHP_EOL;
    }
    public function transmission_push(){
        echo "百度云发送推送!" . PHP_EOL;
    }
}

$jiguangMessage = new JiguangMessage();
$baiduYunMessage = new BaiduYunMessage();
$message = new Message();

// 原来的老系统发短信,使用阿里云
$message->send();
$message->push();


// 部分模块用极光发吧
$jgAdatper = new JiguangSDKAdapter($jiguangMessage);
$jgAdatper->send();
$jgAdatper->push();

// 部分模块用百度云发吧
$bdAatper = new BaiduYunSDKAdapter($baiduYunMessage);
$bdAatper->send();
$bdAatper->push();

설명:

  • 이 예에서는 두 개의 SDK를 적용해야 하기 때문에 두 개의 어댑터가 있습니다. 전력 변환기가 하나만 있을 수 있다고 누가 말했습니까? 일부 마법의 국가가 500V를 사용하더라도 여전히 더 많은 전력 변환기를 가져오면 어떨까요? Message 클래스는 이전에 작성된 코드이고 그 안에 일부 공용 메서드가 있을 수 있으므로 인터페이스 추상화가 없기 때문에 Message 클래스를 상속합니다. 코드를 리팩터링할 때 추상 인터페이스 추출을 고려할 수 있지만 여기서는 어댑터가 인터페이스를 대상으로 할 수 있을 뿐만 아니라 원본 개체와 일치하는 한 아무 것도 상속하지 않아도 괜찮다는 점을 보여주기 위한 것입니다. .결국, 우리는 약한 유형의 언어입니다. Java와 유사한 강력한 유형이라면 여전히 상속이나 구현이 필요합니다(다형성)
  • 결합된 어댑터는 데코레이터와 유사하며 외부 개체를 유지 관리합니다. 클래스의 메소드는 함수를 추가하는 데 사용되는 반면, 어댑터는 함수를 추가하는 경우가 거의 없지만 Laravel의 Filesystem 모듈을 직접 대체합니다. 분명히 말할 것은 없습니다. 어댑터 패턴을 사용하는 여러분, 잘 공부하세요
  • 클래스를 사용하고 싶지만 제공되는 내용이 비즈니스와 맞지 않거나 다른 관련 클래스와 함께 사용할 수 있는 클래스를 만들고 싶을 때; 예상치 못한 수업이 함께 작동한다면 어댑터 패턴을 사용해 보는 것이 좋습니다
  • 추천 학습: "
  • PHP 비디오 튜토리얼
  • "

위 내용은 한 기사에서 PHP의 어댑터 패턴에 대해 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제