목차
주 역할
2. 관련되지 않은 다른 클래스나 예상치 못한 클래스와 함께 작동할 수 있는 재사용 가능한 클래스를 만들고 싶습니다.
" >사실 가장 간단한 예는 타사 라이브러리를 사용하는 것입니다. 이러한 클래스 라이브러리는 버전이 업그레이드됨에 따라 업그레이드되며 해당 API도 변경됩니다. 인터페이스가 바뀌면 어댑터가 유용합니다
이때 프로그래머들은 머리를 써서 해결책을 생각해내야 합니다. 아무리 열심히 노력해도 어느 날 보라색대추, 초록대추, 노랑대추, 산대추 등 원격제어업체가 다 오면 무시할 겁니다. 작업량이 증가함에 따라 이 장난감 클래스는 점점 더 커지고 있으며 프로그래머가 충돌하지 않으면 언젠가는 시스템이 충돌할 것입니다.
백엔드 개발 PHP 튜토리얼 PHP 디자인 패턴에 대하여 - 어댑터 방식에 대한 자세한 설명

PHP 디자인 패턴에 대하여 - 어댑터 방식에 대한 자세한 설명

Mar 17, 2018 pm 03:58 PM
php 디자인 패턴 어댑터

클래스의 인터페이스를 고객이 원하는 다른 인터페이스로 변환합니다. 어댑터 패턴을 사용하면 원래 인터페이스가 호환되지 않아 함께 작동할 수 없었던 클래스도 함께 작동할 수 있습니다. 이 기사에서는 주로 어댑터에 대한 자세한 설명을 공유하여 도움이 되기를 바랍니다.

주 역할

대상 역할: 클라이언트가 사용하는 도메인별 인터페이스를 정의합니다. 이것이 우리가 기대하는 것입니다.

소스 역할: 조정이 필요한 인터페이스

어댑터 역할: Adaptee 인터페이스는 다음에 적응합니다. 대상 인터페이스는 이 모델의 핵심입니다. 어댑터는 소스 인터페이스를 대상 인터페이스로 변환합니다. 이 역할은 기존 클래스를 사용하려는 경우 해당 인터페이스가 수행합니다. 요구 사항을 충족하지 못합니다.

2. 관련되지 않은 다른 클래스나 예상치 못한 클래스와 함께 작동할 수 있는 재사용 가능한 클래스를 만들고 싶습니다.

3. 기존 하위 클래스를 원하지만 인터페이스에 맞게 각 클래스를 하위 클래스로 만드는 것은 불가능합니다. 객체 어댑터는 상위 클래스 인터페이스에 적응할 수 있습니다(객체 어댑터에만 해당).

//目标角色  
interface Target {  
    public function simpleMethod1();  
    public function simpleMethod2();  
}  
  
//源角色  
class Adaptee {  
      
    public function simpleMethod1(){  
        echo &#39;Adapter simpleMethod1&#39;."<br>";  
    }  
}  
  
//类适配器角色  
class Adapter implements Target {  
    private $adaptee;  
      
      
    function __construct(Adaptee $adaptee) {  
        $this->adaptee = $adaptee;   
    }  
      
    //委派调用Adaptee的sampleMethod1方法  
    public function simpleMethod1(){  
        echo $this->adaptee->simpleMethod1();  
    }  
      
    public function simpleMethod2(){  
        echo &#39;Adapter simpleMethod2&#39;."<br>";     
    }   
      
}  
  
//客户端  
class Client {  
      
    public static function main() {  
        $adaptee = new Adaptee();  
        $adapter = new Adapter($adaptee);  
        $adapter->simpleMethod1();  
        $adapter->simpleMethod2();   
    }  
}  
  
Client::main();
로그인 후 복사

위 내용을 기반으로 하는 어댑터가 무엇인지 아직 모를 수도 있습니다. 그럼 다음은 자세히 설명드리겠습니다

어댑터 모드는 언제 사용하나요?

사실 가장 간단한 예는 타사 라이브러리를 사용하는 것입니다. 이러한 클래스 라이브러리는 버전이 업그레이드됨에 따라 업그레이드되며 해당 API도 변경됩니다. 인터페이스가 바뀌면 어댑터가 유용합니다

실용적인 예를 들어보겠습니다


처음에는 조화

헤이자오토이컴퍼니는 장난감 제작을 전문으로 하고 있으며, 제작하는 장난감은 개, 고양이에 국한되지 않습니다. , 사자, 물고기 및 기타 동물. 각 장난감은 "입 열기" 및 "입 닫기" 작업을 수행할 수 있으며 openMouth 및 closeMouth 메서드가 각각 호출됩니다. 이때 추상 클래스인 Toy를 정의하거나 심지어 Toy라는 인터페이스를 먼저 정의하면 된다고 생각하기 쉽습니다. 이러한 문제는 크지 않습니다. 다른 클래스가 상위 클래스를 상속받아 상위 클래스의 메소드를 구현할 수도 있습니다. 조화와 자신감이 있습니다.

원활한 파괴


사업 확장을 위해 이제 블랙데이트토이컴퍼니는 원격제어 장치를 이용해 동물의 입을 제어할 수 있는 레드데이트 리모콘컴퍼니와 협력하게 되었습니다. 그러나 Hongzao Remote Control Company의 원격 제어 장치는 동물의 doMouthOpen 및 doMouthClose 메소드를 호출합니다. Heizao Toy Company의 프로그래머가 지금 해야 할 일은 Toy가 doMouthOpen 및 doMouthClose 메소드를 호출할 수 있도록 Toy 시리즈 클래스를 업그레이드하는 것입니다.


구현 방법을 고려할 때 필요하다면 이 두 가지 방법을 상위 클래스와 하위 클래스에 추가하면 된다고 직접 생각했습니다. 부모 클래스와 하위 클래스에 이 두 가지 메소드를 계속해서 추가하다 보면 이런 반복적인 작업이 늘 고민이 되실텐데요, 해결이 안될까요? 수백 개의 하위 클래스가 있으면 프로그래머는 미칠 것입니다. 프로그래머는 효율성에 영향을 미치지 않으면서 누가 더 "게으른"지 확인하기 위해 경쟁하는 경우가 많습니다. 프로그래머들이 이런 일을 계속한다면 바보처럼 느껴질 것입니다. (사실 제가 이런 바보 같은 짓을 자주 합니다)

abstract class Toy
{
    public abstract function openMouth();

    public abstract function closeMouth();

    //为红枣遥控公司控制接口增加doMouthOpen方法
    public abstract function doMouthOpen();

    //为红枣遥控公司控制接口增加doMouthClose方法
    public abstract function doMouthClose();
}

class Dog extends Toy
{
    public function openMouth()
    {
        echo "Dog open Mouth\n";
    }

    public function closeMouth()
    {
        echo "Dog open Mouth\n";
    }

    //增加的方法
    public function doMouthOpen()
    {
        $this->doMouthOpen();
    }

    //增加的方法
    public function doMouthClose()
    {
        $this->closeMouth();
    }
}

class Cat extends Toy
{
    public function openMouth()
    {
        echo "Cat open Mouth\n";
    }

    public function closeMouth()
    {
        echo "Cat open Mouth\n";
    }

    //增加的方法
    public function doMouthOpen()
    {
        $this->doMouthOpen();
    }

    //增加的方法
    public function doMouthClose()
    {
        $this->closeMouth();
    }
}
로그인 후 복사

더 짜증나

프로그래머가 막 코딩을 마치고 물을 마시고 있는데 갑자기 또 다른 소식이 들려왔습니다. Heizao Toy Company는 Luzao Remote Control Company의 원격 제어 장비가 더 저렴하고 안정적이기 때문에 Luzao Remote Control Company와 협력하기를 원합니다. 그러나 그린데이트리모컨컴퍼니의 원격제어 장치는 입 제어를 구현하기 위해 동물의 operMouth(type) 메소드를 호출한다. 유형이 0이면 "닥쳐", 그렇지 않으면 입을 벌립니다. 이제 프로그래머는 Toy가 operMouth() 메서드를 호출할 수 있도록 Toy와 해당 하위 클래스를 업그레이드해야 합니다. 더 이상 아무도 침착하지 않습니다.

abstract class Toy  
{  
    public abstract function openMouth();  
  
    public abstract function closeMouth();  
  
    public abstract function doMouthOpen();  
  
    public abstract function doMouthClose();  
  
    //为绿枣遥控公司控制接口增加doMouthClose方法  
    public abstract function operateMouth($type = 0);  
}  
  
class Dog extends Toy  
{  
    public function openMouth()  
    {  
        echo "Dog open Mouth\n";  
    }  
  
    public function closeMouth()  
    {  
        echo "Dog open Mouth\n";  
    }  
  
    public function doMouthOpen()  
    {  
        $this->doMouthOpen();  
    }  
  
    public function doMouthClose()  
    {  
        $this->closeMouth();  
    }  
  
    public function operateMouth($type = 0)  
    {  
        if ($type == 0) {  
            $this->closeMouth();  
        } else {  
            $this->operateMouth();  
        }  
    }  
}  
  
class Cat extends Toy  
{  
    public function openMouth()  
    {  
        echo "Cat open Mouth\n";  
    }  
  
    public function closeMouth()  
    {  
        echo "Cat open Mouth\n";  
    }  
  
    public function doMouthOpen()  
    {  
        $this->doMouthOpen();  
    }  
  
    public function doMouthClose()  
    {  
        $this->closeMouth();  
    }  
  
    public function operateMouth($type = 0)  
    {  
        if ($type == 0) {  
            $this->closeMouth();  
        } else {  
            $this->operateMouth();  
        }  
    }  
}
로그인 후 복사

이때 프로그래머들은 머리를 써서 해결책을 생각해내야 합니다. 아무리 열심히 노력해도 어느 날 보라색대추, 초록대추, 노랑대추, 산대추 등 원격제어업체가 다 오면 무시할 겁니다. 작업량이 증가함에 따라 이 장난감 클래스는 점점 더 커지고 있으며 프로그래머가 충돌하지 않으면 언젠가는 시스템이 충돌할 것입니다.

무엇이 문제인가요?

위와 같이 코드를 작성하면 코드 구현이 "개방-폐쇄" 원칙을 위반하므로 소프트웨어 엔터티는 확장을 위해 개방되고 수정을 위해 폐쇄되어야 합니다. 즉, 모듈을 설계할 때 모듈을 수정하지 않고 확장해야 한다. 즉, 모든 시체는 작은 왕국입니다. 당신은 내가 당신의 일에 참여하게 할 수 있지만 내 내부 코드가 실제로 최적화되지 않으면 내 내부 코드를 수정할 수 없습니다. 이 아이디어를 통해 우리는 상속을 사용하는 방법, 다형성을 활용하는 방법, 심지어 "높은 응집력, 낮은 결합도"를 달성하는 방법까지 이해합니다.

回到这个问题,我们现在面临这么一个问题,新的接口方法我要实现,旧的接口(Toy抽象类)也不能动,那么总得有个解决方法吧。那就是引入一个新的类--我们本文的主角--适配器。 适配器要完成的功能很明确,引用现有接口的方法实现新的接口的方法。更像它名字描述的那样,你的接口不改的话,我就利用现有接口和你对接一下吧。

到此,解决方法已经呼之欲出了,下面贴上代码。

<?php
abstract class Toy  
{  
    public abstract function openMouth();  
  
    public abstract function closeMouth();  
}  
  
class Dog extends Toy  
{  
    public function openMouth()  
    {  
        echo "Dog open Mouth\n";  
    }  
  
    public function closeMouth()  
    {  
        echo "Dog close Mouth\n";  
    }  
}  
  
class Cat extends Toy  
{  
    public function openMouth()  
    {  
        echo "Cat open Mouth\n";  
    }  
  
    public function closeMouth()  
    {  
        echo "Cat close Mouth\n";  
    }  
}


//目标角色:红枣遥控公司  
interface RedTarget  
{  
    public function doMouthOpen();  
  
    public function doMouthClose();  
}  
  
//目标角色:绿枣遥控公司及  
interface GreenTarget  
{  
    public function operateMouth($type = 0);  
}


//类适配器角色:红枣遥控公司  
class RedAdapter implements RedTarget  
{  
    private $adaptee;  
  
    function __construct(Toy $adaptee)  
    {  
        $this->adaptee = $adaptee;  
    }  
  
    //委派调用Adaptee的sampleMethod1方法  
    public function doMouthOpen()  
    {  
        $this->adaptee->openMouth();  
    }  
  
    public function doMouthClose()  
    {  
        $this->adaptee->closeMouth();  
    }  
}  
  
//类适配器角色:绿枣遥控公司  
class GreenAdapter implements GreenTarget  
{  
    private $adaptee;  
  
    function __construct(Toy $adaptee)  
    {  
        $this->adaptee = $adaptee;  
    }  
  
    //委派调用Adaptee:GreenTarget的operateMouth方法  
    public function operateMouth($type = 0)  
    {  
        if ($type) {  
            $this->adaptee->openMouth();  
        } else {  
            $this->adaptee->closeMouth();  
        }  
    }  
}



class testDriver  
{  
    public function run()  
    {  
         //实例化一只狗玩具  
        $adaptee_dog = new Dog();  
        echo "给狗套上红枣适配器\n";  
        $adapter_red = new RedAdapter($adaptee_dog);  
        //张嘴  
        $adapter_red->doMouthOpen();  
        //闭嘴  
        $adapter_red->doMouthClose();  
        echo "给狗套上绿枣适配器\n";  
        $adapter_green = new GreenAdapter($adaptee_dog);  
        //张嘴  
        $adapter_green->operateMouth(1);  
        //闭嘴  
        $adapter_green->operateMouth(0);  
    }  
}  
  
$test = new testDriver();  
$test->run();
로그인 후 복사

更加烦躁
最后的结果就是,Toy类及其子类在不改变自身的情况下,通过适配器实现了不同的接口。

最后的总结

将一个类的接口转换成客户希望的另外一个接口,使用原本不兼容的而不能在一起工作的那些类可以在一起工作.

适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)--适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。

위 내용은 PHP 디자인 패턴에 대하여 - 어댑터 방식에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP 날짜 및 시간 CakePHP 날짜 및 시간 Sep 10, 2024 pm 05:27 PM

cakephp4에서 날짜와 시간을 다루기 위해 사용 가능한 FrozenTime 클래스를 활용하겠습니다.

CakePHP 토론 CakePHP 토론 Sep 10, 2024 pm 05:28 PM

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

CakePHP 유효성 검사기 만들기 CakePHP 유효성 검사기 만들기 Sep 10, 2024 pm 05:26 PM

컨트롤러에 다음 두 줄을 추가하면 유효성 검사기를 만들 수 있습니다.

CakePHP 로깅 CakePHP 로깅 Sep 10, 2024 pm 05:26 PM

CakePHP에 로그인하는 것은 매우 쉬운 작업입니다. 한 가지 기능만 사용하면 됩니다. cronjob과 같은 백그라운드 프로세스에 대해 오류, 예외, 사용자 활동, 사용자가 취한 조치를 기록할 수 있습니다. CakePHP에 데이터를 기록하는 것은 쉽습니다. log() 함수는 다음과 같습니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP 빠른 가이드 CakePHP 빠른 가이드 Sep 10, 2024 pm 05:27 PM

CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

See all articles