适配器或包装器模式

解决两个接口不兼容的问题。


// php 技术群:781742505

<?php 

declare(strict_types=1);

interface Book
{
    public function turnPage();

    public function open();

    public function getPage(): int;
}



class PaperBook implements Book
{
    /**
     * @var int
     */
    private $page;

    public function open()
    {
        $this->page = 1;
    }

    public function turnPage()
    {
        $this->page++;
    }

    public function getPage(): int
    {
        return $this->page;
    }
}



interface EBook
{
    public function unlock();

    public function pressNext();

    /**
     * returns current page and total number of pages, like [10, 100] is page 10 of 100
     *
     * @return int[]
     */
    public function getPage(): array;
}



class Kindle implements EBook
{
    /**
     * @var int
     */
    private $page = 1;

    /**
     * @var int
     */
    private $totalPages = 100;

    public function pressNext()
    {
        $this->page++;
    }

    public function unlock()
    {
    }

    /**
     * returns current page and total number of pages, like [10, 100] is page 10 of 100
     *
     * @return int[]
     */
    public function getPage(): array
    {
        return [$this->page, $this->totalPages];
    }
}



class EBookAdapter implements Book
{
    /**
     * @var EBook
     */
    protected $eBook;

    /**
     * @param EBook $eBook
     */
    public function __construct(EBook $eBook)
    {
        $this->eBook = $eBook;
    }

    /**
     * This class makes the proper translation from one interface to another.
     */
    public function open()
    {
        $this->eBook->unlock();
    }

    public function turnPage()
    {
        $this->eBook->pressNext();
    }

    /**
     * notice the adapted behavior here: EBook::getPage() will return two integers, but Book
     * supports only a current page getter, so we adapt the behavior here
     *
     * @return int
     */
    public function getPage(): int
    {
        return $this->eBook->getPage()[0];
    }
}


// 使用起来
$book = new PaperBook();
$book->open();
$book->turnPage();


$kindle = new Kindle();
$book = new EBookAdapter($kindle);
$book->open();
$book->turnPage();
### 包装器模式(装饰器模式) 包装器模式也被称为装饰器模式,是一种结构型设计模式。其核心思想是在不改变现有对象结构的情况下,动态地给对象添加额外的职责。该模式通过创建一个包装对象(装饰器)来包裹真实对象,从而实现功能的增强。 在Spring Boot中,包装器模式主要体现在`BeanPostProcessor`上,它能够增强`bean`的功能。`BeanPostProcessor`是Spring框架中的一个接口,定义了两个方法:`postProcessBeforeInitialization`和`postProcessAfterInitialization`。这两个方法分别在`bean`初始化前后被调用,允许开发者在这两个时间点对`bean`进行额外的处理,从而实现对`bean`功能的增强。 以下是一个简单的示例代码,展示了如何使用`BeanPostProcessor`来增强`bean`的功能: ```java import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; @Component public class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // 在bean初始化之前进行处理 System.out.println("Before Initialization: " + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // 在bean初始化之后进行处理 System.out.println("After Initialization: " + beanName); return bean; } } ``` ### 适配器模式 适配器模式是一种结构型设计模式,主要目的是将一个类的接口转换为另一个客户端所期望的接口,从而使原本由于接口不兼容而无法协同工作的类能够一起工作。 在Spring Boot中,适配器模式有多种应用场景: - **处理不同的请求和响应格式**:在处理不同的请求和响应格式时,适配器模式可以将不同格式的数据转换为统一的格式,以便系统进行处理[^1]。 - **对不同类型的处理器的统一处理**:在Spring MVC框架中,适配器模式主要体现在对不同类型的处理器(即`Controller`)的统一处理上。Spring MVC通过适配器模式来保证无论`Controller`的实现方式如何多样化,都能够被`DispatcherServlet`统一调用和管理[^5]。 - **支付网关的统一交互**:通过使用适配器模式,可以在运行时灵活地选择不同的支付网关,并使用统一的接口与之交互。这种方式不仅提高了代码的可读性和可维护性,还使得扩展新的支付网关变得非常简单。在Spring Boot中,依赖注入机制进一步简化了适配器模式的实现过程[^2]。 以下是一个简单的适配器模式示例,模拟不同支付网关的统一处理: ```java // 目标接口 interface PaymentGateway { void pay(double amount); } // 具体支付网关实现1 class AlipayGateway { public void alipayPay(double amount) { System.out.println("Alipay: Paying " + amount); } } // 具体支付网关实现2 class WechatPayGateway { public void wechatPay(double amount) { System.out.println("Wechat Pay: Paying " + amount); } } // 适配器类1 class AlipayAdapter implements PaymentGateway { private AlipayGateway alipayGateway; public AlipayAdapter(AlipayGateway alipayGateway) { this.alipayGateway = alipayGateway; } @Override public void pay(double amount) { alipayGateway.alipayPay(amount); } } // 适配器类2 class WechatPayAdapter implements PaymentGateway { private WechatPayGateway wechatPayGateway; public WechatPayAdapter(WechatPayGateway wechatPayGateway) { this.wechatPayGateway = wechatPayGateway; } @Override public void pay(double amount) { wechatPayGateway.wechatPay(amount); } } ``` ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值