學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)適配器模式
一、意圖
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。Adapter模式使得原來由于接口不兼容而不能一起工作的那此類可以一起工作
二、適配器模式結(jié)構(gòu)圖
三、適配器模式中主要角色
目標(biāo)(Target)角色:定義客戶端使用的與特定領(lǐng)域相關(guān)的接口,這也就是我們所期待得到的
源(Adaptee)角色:需要進(jìn)行適配的接口
適配器(Adapter)角色:對(duì)Adaptee的接口與Target接口進(jìn)行適配;適配器是本模式的核心,適配器把源接口轉(zhuǎn)換成目標(biāo)接口,此角色為具體類
四、適配器模式適用場(chǎng)景
1、你想使用一個(gè)已經(jīng)存在的類,而它的接口不符合你的需求
2、你想創(chuàng)建一個(gè)可以復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見的類協(xié)同工作
3、你想使用一個(gè)已經(jīng)存在的子類,但是不可能對(duì)每一個(gè)都進(jìn)行子類化以匹配它們的接口。對(duì)象適配器可以適配它的父類接口(僅限于對(duì)象適配器)
五、類適配器模式與對(duì)象適配器
類適配器:Adapter與Adaptee是繼承關(guān)系
1、用一個(gè)具體的Adapter類和Target進(jìn)行匹配。結(jié)果是當(dāng)我們想要一個(gè)匹配一個(gè)類以及所有它的子類時(shí),類Adapter將不能勝任工作
2、使得Adapter可以重定義Adaptee的部分行為,因?yàn)锳dapter是Adaptee的一個(gè)子集
3、僅僅引入一個(gè)對(duì)象,并不需要額外的指針以間接取得adaptee
對(duì)象適配器:Adapter與Adaptee是委托關(guān)系
1、允許一個(gè)Adapter與多個(gè)Adaptee同時(shí)工作。Adapter也可以一次給所有的Adaptee添加功能
2、使用重定義Adaptee的行為比較困難
適配器模式與其它模式
橋梁模式(bridge模式):橋梁模式與對(duì)象適配器類似,但是橋梁模式的出發(fā)點(diǎn)不同:橋梁模式目的是將接口部分和實(shí)現(xiàn)部分分離,從而對(duì)它們可以較為容易也相對(duì)獨(dú)立的加以改變。而對(duì)象適配器模式則意味著改變一個(gè)已有對(duì)象的接口
裝飾器模式(decorator模式):裝飾模式增強(qiáng)了其他對(duì)象的功能而同時(shí)又不改變它的接口。因此裝飾模式對(duì)應(yīng)用的透明性比適配器更好。
六、類適配器模式PHP示例
類適配器使用的是繼承
<?php /** * 目標(biāo)角色 */ interface Target { /** * 源類也有的方法1 */ public function sampleMethod1(); /** * 源類沒有的方法2 */ public function sampleMethod2(); } /** * 源角色 */ class Adaptee { /** * 源類含有的方法 */ public function sampleMethod1() { echo 'Adaptee sampleMethod1 <br />'; } } /** * 類適配器角色 */ class Adapter extends Adaptee implements Target { /** * 源類中沒有sampleMethod2方法,在此補(bǔ)充 */ public function sampleMethod2() { echo 'Adapter sampleMethod2 <br />'; } } class Client { /** * Main program. */ public static function main() { $adapter = new Adapter(); $adapter->sampleMethod1(); $adapter->sampleMethod2(); } } Client::main(); ?>
七、對(duì)象適配器模式PHP示例
對(duì)象適配器使用的是委派
<?php /** * 目標(biāo)角色 */ interface Target { /** * 源類也有的方法1 */ public function sampleMethod1(); /** * 源類沒有的方法2 */ public function sampleMethod2(); } /** * 源角色 */ class Adaptee { /** * 源類含有的方法 */ public function sampleMethod1() { echo 'Adaptee sampleMethod1 <br />'; } } /** * 類適配器角色 */ class Adapter implements Target { private $_adaptee; public function __construct(Adaptee $adaptee) { $this->_adaptee = $adaptee; } /** * 委派調(diào)用Adaptee的sampleMethod1方法 */ public function sampleMethod1() { $this->_adaptee->sampleMethod1(); } /** * 源類中沒有sampleMethod2方法,在此補(bǔ)充 */ public function sampleMethod2() { echo 'Adapter sampleMethod2 <br />'; } } class Client { /** * Main program. */ public static function main() { $adaptee = new Adaptee(); $adapter = new Adapter($adaptee); $adapter->sampleMethod1(); $adapter->sampleMethod2(); } } Client::main(); ?>
以上就是使用php實(shí)現(xiàn)適配器模式的代碼,還有一些關(guān)于適配器模式的概念區(qū)分,希望對(duì)大家的學(xué)習(xí)有所幫助。
- PHP設(shè)計(jì)模式之適配器模式(Adapter)原理與用法詳解
- php設(shè)計(jì)模式 Adapter(適配器模式)
- PHP設(shè)計(jì)模式之適配器模式代碼實(shí)例
- PHP設(shè)計(jì)模式之適配器模式原理與用法分析
- php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解
- PHP設(shè)計(jì)模式之適配器模式定義與用法詳解
- php設(shè)計(jì)模式之適配器模式實(shí)例分析【星際爭(zhēng)霸游戲案例】
- PHP設(shè)計(jì)模式(四)原型模式Prototype實(shí)例詳解【創(chuàng)建型】
- PHP設(shè)計(jì)模式(三)建造者模式Builder實(shí)例詳解【創(chuàng)建型】
- PHP設(shè)計(jì)模式(一)工廠模式Factory實(shí)例詳解【創(chuàng)建型】
- PHP設(shè)計(jì)模式概論【概念、分類、原則等】
- PHP設(shè)計(jì)模式(五)適配器模式Adapter實(shí)例詳解【結(jié)構(gòu)型】
相關(guān)文章
微信公眾平臺(tái)開發(fā)教程②微信端分享功能圖文詳解
這篇文章主要介紹了微信公眾平臺(tái)開發(fā)微信端分享功能,結(jié)合圖文形式詳細(xì)分析了微信分享功能的原理、操作步驟及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-04-04Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安裝配置方法
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安裝配置方法...2007-05-05淺談PHP模擬發(fā)送POST請(qǐng)求之curl基本使用
今天來介紹PHP模擬發(fā)送POST請(qǐng)求的重型武器——cURL函數(shù)庫的使用和其多線程的優(yōu)化方法。說起cURL函數(shù),可謂是老生常談,但網(wǎng)上許多資料都在關(guān)鍵部分語焉不詳,于是筆者翻了些資料,結(jié)合自己的筆記,總結(jié)了這篇文章,希望能給初次接觸cURL的開發(fā)者提供一些幫助。2021-05-05PHP imagecreatefrombmp 從BMP文件或URL新建一圖像
大家都知道php GD庫可方便的從URL新建一圖像, GD中有imagecreatefromjpeg(),imagecreatefromPNG()....等2012-07-07php中實(shí)現(xiàn)字符串翻轉(zhuǎn)的方法
本文主要介紹了實(shí)現(xiàn)php字符串翻轉(zhuǎn)的方法,具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02