> 백엔드 개발 > PHP 튜토리얼 > 객체지향 고급 디자인 패턴: 어댑터 패턴

객체지향 고급 디자인 패턴: 어댑터 패턴

巴扎黑
풀어 주다: 2023-03-07 19:44:02
원래의
1842명이 탐색했습니다.

어댑터 패턴이란 무엇인가요?

어댑터 패턴은 단순히 객체의 인터페이스를 다른 객체가 기대하는 인터페이스에 맞게 조정합니다.

어댑터 패턴 애플리케이션 문제 및 해결 방법

애플리케이션에서 구조적으로 안정적이고 안정적인 작동 코드 기반을 사용할 수 있습니다. 그러나 우리는 기존 개체를 원래 디자인된 방식과 다른 방식으로 사용해야 하는 새로운 기능을 추가하는 경우가 많습니다. 이 시점에서 장애물은 단순히 새 기능에 다른 이름이 필요하다는 것일 수 있습니다. 더 복잡한 시나리오에서는 새로운 기능이 원래 개체와 약간 다른 동작을 요구한다는 점이 장애물이 될 수도 있습니다.

위 문제를 해결하기 위해 우리가 채택한 솔루션은 어댑터 패턴을 사용하여 다른 개체를 만드는 것입니다. 이 Adapter 개체는 원래 응용 프로그램과 새 기능 사이의 중개자 역할을 합니다. 어댑터 패턴은 새 개체의 요구 사항에 맞게 기존 개체에 대한 새 인터페이스를 정의합니다.

문제

Alipay 결제 클래스의 기능을 다음과 같이 가정합니다.

/** 
 * 支付宝支付类 
 */  
class Alipay  
{  
    public function sendPayment()  
    {  
        echo '使用支付宝支付。';  
    }  
}  
  
// 客户端代码  
$alipay = new Alipay();  
$alipay->sendPayment();
로그인 후 복사

Alipay 클래스를 직접 인스턴스화하여 결제 기능을 완성합니다. 이러한 클라이언트 코드는 많을 수 있습니다.

일정 시간이 지난 후 Alipay의 Alipay 클래스가 업그레이드되고 메소드 이름이 sendPayment()에서 goPayment()로 변경되면 어떻게 되나요?

sendPayment()를 사용하는 모든 클라이언트 코드를 변경해야 합니다.

알리페이 클래스가 자주 업그레이드되거나 클라이언트가 여러 곳에서 사용된다면 엄청난 작업량이 될 것입니다.

해결됨

이제 어댑터 패턴을 사용하여 해결합니다.

원본 Alipay를 클라이언트가 요구하는 형태로 변환하기 위해 클라이언트와 Alipay 클래스 사이에 중간 클래스, 즉 어댑터 클래스를 추가합니다.

클라이언트가 통합 클래스 메소드를 호출할 수 있도록 먼저 어댑터 인터페이스를 정의합니다.

/** 
 * 适配器接口,所有的支付适配器都需实现这个接口。 
 * 不管第三方支付实现方式如何,对于客户端来说,都 
 * 用pay()方法完成支付 
 */  
interface PayAdapter  
{  
    public function pay();  
}
로그인 후 복사

Alipay 클래스를 제어할 수 없고 자주 업데이트될 수 있으므로, 그래서 우리는 그것을 사용하지 않습니다. 변경하십시오.

새로운 AlipayAdapter 어댑터 클래스를 생성하고 다음과 같이 pay()에서 Alipay의 결제 기능을 변환합니다.

/** 
 * 支付宝适配器 
 */  
class AlipayAdapter implements PayAdapter  
{  
    public function pay()  
    {  
        // 实例化Alipay类,并用Alipay的方法实现支付  
        $alipay = new Alipay();  
        $alipay->sendPayment();  
    }  
}
로그인 후 복사

클라이언트 사용법:

// 客户端代码  
$alipay = new AlipayAdapter();  
// 用pay()方法实现支付  
$alipay->pay();
로그인 후 복사

이런 식으로 Alipay If 결제 방법이 변경되면 AlipayAdapter 클래스만 수정하면 됩니다.

새로운 클래스에 적응

어댑터를 사용하면 확장이 더 쉬워집니다.

위 예시를 이어가면 알리페이를 기반으로 위챗 결제를 추가하는데, 결제하려면 QR코드를 스캔해야 한다는 점에서 알리페이와 다릅니다.

이 경우에도 위챗의 결제 기능을 직접 사용하는 대신 어댑터를 사용해야 합니다.

코드는 다음과 같습니다.

/** 
 * 微信支付类 
 */  
class WechatPay  
{  
    public function scan()  
    {  
        echo '扫描二维码后,';  
    }  
  
    public function doPay()  
    {  
        echo '使用微信支付';  
    }  
}  
  
/** 
 * 微信支付适配器 
 */  
class WechatPayAdapter implements PayAdapter  
{  
    public function pay()  
    {  
        // 实例化WechatPay类,并用WechatPay的方法实现支付。  
        // 注意,微信支付的方式和支付宝的支付方式不一样,但是  
        // 适配之后,他们都能用pay()来实现支付功能。  
        $wechatPay = new WechatPay();  
        $wechatPay->scan();  
        $wechatPay->doPay();  
    }  
}
로그인 후 복사

클라이언트 사용법:

// 客户端代码  
$wechat = new WechatPayAdapter();  
// 也是用pay()方法实现支付  
$wechat->pay();
로그인 후 복사

어댑터의 확장 기능입니다.

타사 클래스(Alipay, WeChat Pay)를 처리하는 방법을 만들었습니다.

API가 변경되면 클라이언트가 의존하는 어댑터 클래스만 수정하면 됩니다. 타사 클래스 자체를 수정하거나 노출합니다.

UML 다이어그램

위 어댑터 패턴의 코드는 다음과 같이 UML에 해당합니다.

객체지향 고급 디자인 패턴: 어댑터 패턴

요약

대형 애플리케이션에는 계속해서 새로운 라이브러리와 새로운 API가 추가됩니다.

변경으로 인해 발생하는 문제를 방지하려면 어댑터 패턴으로 패키징하여 애플리케이션에 대한 통일된 참조 방법을 제공해야 합니다.

이를 통해 코드가 더욱 구조화되고 관리 및 확장이 쉬워집니다.

위 내용은 객체지향 고급 디자인 패턴: 어댑터 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿