美文网首页
PHP设计模式之适配器模式(Adapter) 代码实例大全(十)

PHP设计模式之适配器模式(Adapter) 代码实例大全(十)

作者: 八重樱勿忘 | 来源:发表于2020-09-14 20:39 被阅读0次

    目的

    将某个类的接口转换成另一个接口以兼容,适配器使得原来因为接口不同而无法一起使用的类可以一起工作。

    适配器通过将原始接口进行转换,给用户提供一个兼容接口。

    例子

    客户端数据库适配器

    使用多个不同的网络服务和适配器来规范数据使得出结果是相同的

    UML 图

    ★BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货​

    代码

    • BookInterface.php
    
    <?php
    
    namespace DesignPatterns\Structural\Adapter;
    
    interface BookInterface
    {
        public function turnPage();
    
        public function open();
    
        public function getPage(): int;
    }
    
    
    
    
    
    • Book.php
    
    <?php
    
    namespace DesignPatterns\Structural\Adapter;
    
    class Book implements BookInterface
    {
        /**
        * @var int
        */
        private $page;
    
        public function open()
        {
            $this->page = 1;
        }
    
        public function turnPage()
        {
            $this->page++;
        }
    
        public function getPage(): int
        {
            return $this->page;
        }
    }
    
    • EBookAdapter.php
    
    <?php
    
    namespace DesignPatterns\Structural\Adapter;
    
    /**
    * 这里是一个适配器. 注意他实现了 BookInterface,
    * 因此你不必去更改客户端代码当使用 Book
    */
    class EBookAdapter implements BookInterface
    {
        /**
        * @var EBookInterface
        */
        protected $eBook;
    
        /**
        * @param EBookInterface $eBook
        */
        public function __construct(EBookInterface $eBook)
        {
            $this->eBook = $eBook;
        }
    
        /**
        * 这个类使接口进行适当的转换.
        */
        public function open()
        {
            $this->eBook->unlock();
        }
    
        public function turnPage()
        {
            $this->eBook->pressNext();
        }
    
        /**
        * 注意这里适配器的行为: EBookInterface::getPage() 将返回两个整型,除了 BookInterface
        * 仅支持获得当前页,所以我们这里适配这个行为
        *
        * @return int
        */
        public function getPage(): int
        {
            return $this->eBook->getPage()[0];
        }
    }
    
    • EBookInterface.php
    
    <?php
    
    namespace DesignPatterns\Structural\Adapter;
    
    interface EBookInterface
    {
        public function unlock();
    
        public function pressNext();
    
        /**
        * 返回当前页和总页数,像 [10, 100] 是总页数100中的第10页。
        *
        * @return int[]
        */
        public function getPage(): array;
    }
    
    • Kindle.php
    
    <?php
    
    namespace DesignPatterns\Structural\Adapter;
    
    /**
    * 这里是适配过的类. 在生产代码中, 这可能是来自另一个包的类,一些供应商提供的代码。
    * 注意它使用了另一种命名方案并用另一种方式实现了类似的操作
    */
    class Kindle implements EBookInterface
    {
        /**
        * @var int
        */
        private $page = 1;
    
        /**
        * @var int
        */
        private $totalPages = 100;
    
        public function pressNext()
        {
            $this->page++;
        }
    
        public function unlock()
        {
        }
    
        /**
        * 返回当前页和总页数,像 [10, 100] 是总页数100中的第10页。
        *
        * @return int[]
        */
        public function getPage(): array
        {
            return [$this->page, $this->totalPages];
        }
    }
    

    测试

    • Tests/AdapterTest.php
    
    <?php
    
    namespace DesignPatterns\Structural\Adapter\Tests;
    
    use DesignPatterns\Structural\Adapter\Book;
    use DesignPatterns\Structural\Adapter\EBookAdapter;
    use DesignPatterns\Structural\Adapter\Kindle;
    use PHPUnit\Framework\TestCase;
    
    class AdapterTest extends TestCase
    {
        public function testCanTurnPageOnBook()
        {
            $book = new Book();
            $book->open();
            $book->turnPage();
    
            $this->assertEquals(2, $book->getPage());
        }
    
        public function testCanTurnPageOnKindleLikeInANormalBook()
        {
            $kindle = new Kindle();
            $book = new EBookAdapter($kindle);
    
            $book->open();
            $book->turnPage();
    
            $this->assertEquals(2, $book->getPage());
        }
    }
    

    PHP 互联网架构师成长之路*「设计模式」终极指南

    PHP 互联网架构师 50K 成长指南+行业问题解决总纲(持续更新)

    面试10家公司,收获9个offer,2020年PHP 面试问题

    ★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入我们的群啊,暗号:phpzh(群号码856460874)。

    2020年最新PHP进阶教程,全系列!​

    内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题 建议 想看的内容可以在评论提出

    相关文章

      网友评论

          本文标题:PHP设计模式之适配器模式(Adapter) 代码实例大全(十)

          本文链接:https://www.haomeiwen.com/subject/vmltyktx.html