校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > PHP設(shè)計(jì)模式之適配器模式(Adapter)原理與用法詳解

PHP設(shè)計(jì)模式之適配器模式(Adapter)原理與用法詳解

熱門標(biāo)簽:百應(yīng)電話機(jī)器人服務(wù) 河南電銷卡外呼系統(tǒng)哪家強(qiáng) 揚(yáng)州地圖標(biāo)注app 昭通辦理400電話 山西探意電話機(jī)器人 騰訊外呼管理系統(tǒng) 青島語音外呼系統(tǒng)招商 岳陽外呼型呼叫中心系統(tǒng)在哪里 山西回?fù)芡夂粝到y(tǒng)

本文實(shí)例講述了PHP設(shè)計(jì)模式之適配器模式(Adapter)原理與用法。分享給大家供大家參考,具體如下:

這個(gè)適配器模式,就是為了將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,并且使用原本不兼容的而不能在一起工作的那些類可以在一起工作。它的核心思想就是把對某些相似的類的操作轉(zhuǎn)化為一個(gè)統(tǒng)一的“接口”(這里是比喻的說話)--適配器,或者比喻為一個(gè)“界面”,統(tǒng)一或屏蔽了那些類的細(xì)節(jié)。適配器模式還構(gòu)造了一種“機(jī)制”,使“適配”的類可以很容易的增減,而不用修改與適配器交互的代碼,符合“減少代碼間耦合”的設(shè)計(jì)原則。

我們來考慮下開發(fā)過程中,我們引用一個(gè)第三方類庫的場景,這個(gè)類庫隨著版本的改變,它提供的API也可能會改變。如果很不幸的是,你的應(yīng)用里引用的某個(gè)API已經(jīng)發(fā)生改變的時(shí)候,除了在心中默默地罵“wocao”之外,你還得去硬著頭皮去改大量的代碼,這個(gè)時(shí)候,為了減少工作量,我們就可以使用適配器模式。

先來看一個(gè)網(wǎng)上的案例:

  • 假如我們原始的有一個(gè)UserInfo的類,提供用戶信息的類,早起設(shè)計(jì)該類的時(shí)候,只實(shí)現(xiàn)了一個(gè)getUserName獲取用戶名的方法。
  • 我們的MyOldObject類中,將從UserInfo這個(gè)類中獲取用戶信息,并且輸出用戶名
  • 隨著時(shí)間的推移,我們舊的UserInfo這個(gè)類只提供的獲取用戶名的方法,已經(jīng)沒法滿足需求,我們同時(shí)需要獲取用戶的年齡等信息。
  • 為了不改變原本UserInfo這個(gè)類,我們就繼承UserInfo,建立一個(gè)UserInfoAdapter類,實(shí)現(xiàn)getAge獲取年齡這樣的方法。
  • 在我們的MyNewObject新的類中,我們實(shí)例化UserInfoAdapter,打印出用戶姓名和年齡。
  • 這樣,隨著我們的擴(kuò)展,我們沒有改變原先UserInfo這個(gè)類和使用這個(gè)類的接口,我們通過適配的方法,將UserInfo類擴(kuò)展出來

代碼實(shí)現(xiàn)過程如下:

?php
//早期的一個(gè)用戶類,只實(shí)現(xiàn)獲取用戶名的方法
class UserInfo {
    public function getUserName() {
        return 'initphp';
    }
}

//MyOldObject類,從UserInfo類中獲取信息,輸出用戶名
?php
include_once("UserInfo.php");
class MyOldObject {
    public function write() {
        $UserInfo = new UserInfo;
        echo $UserInfo->getUserName();
    }
}
$a = new MyOldObject;
$a->write();

上述代碼是早期的時(shí)候,我們使用的案例。然而UserInfoAdapter類,隨著時(shí)間推移,項(xiàng)目需求在變化,UserInfo類無法滿足需求,我們做了UserInfo類的適配器,滿足新功能的需求,如下:

?php
include_once("UserInfo.php");
class UserInfoAdapter extends UserInfo{
    public function getUserAge() {
        return 28;
    }
    public function getUser() {
        return array(
            'username' => $this->getUserName(),
            'age' => $this->getUserAge()
        );
    }
}

MyNewObject類,新功能的類,需要打印出用戶年齡和姓名,UserInfo類無法滿足需求,需要調(diào)用UserInfoAdapter適配器這個(gè)類,如下:

?php
include_once("UserInfoAdapter.php");
class MyNewObject {
    public function write() {
        $UserInfoAdapter = new UserInfoAdapter;
        print_r($UserInfoAdapter->getUser());
    }
}
$a = new MyNewObject;
$a->write();

大概了解了哈,接下來咱們通過一個(gè)故事來了解下。

開始的時(shí)候,黑棗玩具公司專門生產(chǎn)玩具,生產(chǎn)的玩具不限于狗、貓、獅子,魚等動物,并且每個(gè)玩具都可以進(jìn)行“張嘴”與“閉嘴”操作,分別調(diào)用了openMouth與closeMouth方法。在這個(gè)時(shí)候,黑棗玩具公司的程序猿就定義一個(gè)抽象類Toy,甚至是接口Toy,完事其他的類去繼承父類,實(shí)現(xiàn)父類的方法,很和諧的是吧。

后來,為了擴(kuò)大業(yè)務(wù),也因?yàn)榧t棗遙控公司可以使用遙控設(shè)備對動物進(jìn)行嘴巴控制,黑棗玩具公司打算與紅棗遙控公司合作。不過,麻煩的是,紅棗遙控公司的遙控設(shè)備是調(diào)用的動物的doMouthOpen及doMouthClose方法。所以,黑棗玩具公司的程序員現(xiàn)在必須要做的是對Toy系列類進(jìn)行升級改造,使Toy能調(diào)用doMouthOpen及doMouthClose方法。

在考慮實(shí)現(xiàn)的方法時(shí),黑棗玩具公司的程序猿可以再在他們的父類子類里給紅棗遙控公司添加這么兩個(gè)方法就好啦。但是,當(dāng)黑棗玩具公司的程序猿一次又一次在父類子類里面重復(fù)添加著這兩個(gè)方法的時(shí)候,總會想著如此重復(fù)的工作,難道不能解決么?當(dāng)有數(shù)百個(gè)子類的時(shí)候,程序員會改瘋的。程序員往往比的是誰在不影響效率的時(shí)候更會“偷懶”,這樣做下去程序員會覺得自己很傻。

咱也不廢話了,先來看下最開始的時(shí)候的代碼:

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 open Mouth\n";
  }
}
class Cat extends Toy
{
  public function openMouth()
  {
    echo "Cat open Mouth\n";
  }
  public function closeMouth()
  {
    echo "Cat open Mouth\n";
  }
}

完事,因?yàn)榫G棗遙控公司遙控設(shè)備更便宜穩(wěn)定,所以黑棗玩具公司又打算要與綠棗遙控公司合作。

不過綠棗遙控公司的遙控設(shè)備是調(diào)用的動物的operMouth(type)方法來實(shí)現(xiàn)嘴巴控制。如果type)方法來實(shí)現(xiàn)嘴巴控制。如果type為0則“閉嘴”,反之張嘴。這下好了,程序員又得對Toy及其子類進(jìn)行升級,使Toy能調(diào)用operMouth()方法。

在這個(gè)時(shí)候,程序員必須要動腦子想辦法了,就算自己勤快,萬一哪天紫棗青棗黃棗山棗這些遙控公司全來的時(shí)候,忽略自己不斷增多的工作量不說,這個(gè)Toy類可是越來越大,總有一天程序員不崩潰,系統(tǒng)也會崩潰的。

那么,問題出在哪里呢?

其實(shí)就是一開始的代碼設(shè)計(jì)實(shí)現(xiàn)違反了“開-閉”原則,也就是一個(gè)軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉。也就是說,在設(shè)計(jì)一個(gè)模塊的時(shí)候,應(yīng)當(dāng)使這個(gè)模塊可以在不被修改的前提下被擴(kuò)展。也就是說每個(gè)尸體都是一個(gè)小王國,你讓我參與你的事情這個(gè)可以,但你不能修改我的內(nèi)部,除非我的內(nèi)部代碼確實(shí)可以優(yōu)化。

來看下最后的結(jié)果:

?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";
  }
}
//目標(biāo)角色:紅棗遙控公司
interface RedTarget
{
  public function doMouthOpen();
  public function doMouthClose();
}
//目標(biāo)角色:綠棗遙控公司及
interface GreenTarget
{
  public function operateMouth($type = 0);
}
//類適配器角色:紅棗遙控公司
class RedAdapter implements RedTarget
{
  private $adaptee;
  function __construct(Toy $adaptee)
  {
    $this->adaptee = $adaptee;
  }
  //委派調(diào)用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;
  }
  //委派調(diào)用Adaptee:GreenTarget的operateMouth方法
  public function operateMouth($type = 0)
  {
    if ($type) {
      $this->adaptee->openMouth();
    } else {
      $this->adaptee->closeMouth();
    }
  }
}
class testDriver
{
  public function run()
  {
     //實(shí)例化一只狗玩具
    $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();

大概了解了使用方式之后,我們來看下適配器模式之中的主要角色:

  1. 目標(biāo)(Target)角色:定義客戶端使用的與特定領(lǐng)域相關(guān)的接口,這也就是我們所期待得到的
  2. 源(Adaptee)角色:需要進(jìn)行適配的接口
  3. 適配器(Adapter)角色:對Adaptee的接口與Target接口進(jìn)行適配;適配器是本模式的核心,適配器把源接口轉(zhuǎn)換成目標(biāo)接口,此角色為具體類

使用場景如下:

   1、你想使用一個(gè)已經(jīng)存在的類,而它的接口不符合你的需求
   2、你想創(chuàng)建一個(gè)可以復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見的類協(xié)同工作
   3、你想使用一個(gè)已經(jīng)存在的子類,但是不可能對每一個(gè)都進(jìn)行子類化以匹配它們的接口。對象適配器可以適配它的父類接口(僅限于對象適配器)

再來看下類適配器和對象適配器的一些解釋和區(qū)別:

類適配器: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è)對象,并不需要額外的指針以間接取得adaptee

對象適配器:Adapter與Adaptee是委托關(guān)系

   1、允許一個(gè)Adapter與多個(gè)Adaptee同時(shí)工作。Adapter也可以一次給所有的Adaptee添加功能
   2、使用重定義Adaptee的行為比較困難

再來看下其它和適配器模式的對比:

  1. 橋梁模式(bridge模式):橋梁模式與對象適配器類似,但是橋梁模式的出發(fā)點(diǎn)不同,橋梁模式目的是將接口部分和實(shí)現(xiàn)部分分離,從而對它們可以較為容易也相對獨(dú)立的加以改變。而對象適配器模式則意味著改變一個(gè)已有對象的接口
  2. 裝飾器模式(decorator模式):裝飾模式增強(qiáng)了其他對象的功能而同時(shí)又不改變它的接口。因此裝飾模式對應(yīng)用的透明性比適配器更好。

最后來看下類適配器和對象適配器案例,如下:

//類適配器使用的是繼承
?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();
?>

//對象適配器使用的是委派
?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();
?>

好啦,本次記錄就到這里了。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP pthreads v3下worker和pool的使用方法示例
  • PHP-FPM 設(shè)置多pool及配置文件重寫操作示例
  • PHP設(shè)計(jì)模式之建造者模式(Builder)原理與用法案例詳解
  • PHP設(shè)計(jì)模式之策略模式(Strategy)入門與應(yīng)用案例詳解
  • PHP設(shè)計(jì)模式之單例模式入門與應(yīng)用詳解
  • PHP設(shè)計(jì)模式之觀察者模式入門與應(yīng)用案例詳解
  • php設(shè)計(jì)模式之單例模式用法經(jīng)典示例分析
  • php設(shè)計(jì)模式之觀察者模式定義與用法經(jīng)典示例
  • 淺談PHP設(shè)計(jì)模式之對象池模式Pool

標(biāo)簽:宜賓 南陽 湛江 黃南 銅川 鎮(zhèn)江 婁底 寶雞

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP設(shè)計(jì)模式之適配器模式(Adapter)原理與用法詳解》,本文關(guān)鍵詞  PHP,設(shè)計(jì)模式,之,適配器,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP設(shè)計(jì)模式之適配器模式(Adapter)原理與用法詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP設(shè)計(jì)模式之適配器模式(Adapter)原理與用法詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美xingq一区二区| 91啪在线观看| 久久久久国产精品麻豆| 久久国产精品一区二区| 久久精品亚洲精品国产欧美kt∨ | 91免费看`日韩一区二区| 亚洲欧洲99久久| 91国产免费观看| 五月天激情小说综合| 精品奇米国产一区二区三区| 国产一区视频网站| 亚洲视频一区二区在线| 欧美久久久久久久久| 九九**精品视频免费播放| 中文字幕精品三区| 91国产精品成人| 另类小说图片综合网| 国产亚洲精品7777| 在线观看一区不卡| 精品中文字幕一区二区| 国产精品理论片在线观看| 欧美系列一区二区| 国产一区二区免费看| 亚洲美女一区二区三区| 欧美一区二区视频在线观看2020| 国产综合色产在线精品| 亚洲免费av在线| 精品精品欲导航| 91日韩一区二区三区| 日本不卡在线视频| 毛片一区二区三区| 91视频xxxx| 麻豆极品一区二区三区| 中文字幕一区二区三区av| 制服丝袜av成人在线看| 国产精品亚洲а∨天堂免在线| 一区二区三区影院| 久久久国产午夜精品| 欧洲av在线精品| 国产91精品精华液一区二区三区| 一区二区三区在线视频免费| 久久久不卡影院| 这里只有精品99re| 91视频观看免费| 美腿丝袜亚洲综合| 悠悠色在线精品| 中文字幕av一区 二区| 91精品国产全国免费观看| 91免费在线播放| 国产大片一区二区| 美女网站色91| 一区二区三区中文在线观看| 国产蜜臀97一区二区三区| 日韩欧美色综合网站| 欧美三级日韩三级国产三级| 成人白浆超碰人人人人| 激情综合亚洲精品| 肉色丝袜一区二区| 亚洲国产你懂的| 中文字幕一区二区在线观看| 久久先锋影音av| 日韩免费电影网站| 91麻豆精品国产91久久久使用方法| 丰满少妇久久久久久久| 国产精品亚洲第一| 国产乱人伦偷精品视频免下载| 视频精品一区二区| 婷婷开心激情综合| 日本特黄久久久高潮| 亚洲成人久久影院| 五月天欧美精品| 五月天丁香久久| 亚洲成人av中文| 偷拍一区二区三区| 石原莉奈在线亚洲三区| 日产欧产美韩系列久久99| 亚洲成人自拍偷拍| 偷拍自拍另类欧美| 免费成人在线观看| 美国三级日本三级久久99| 蜜臀精品一区二区三区在线观看| 日韩av不卡在线观看| 在线视频你懂得一区| 精东粉嫩av免费一区二区三区| 免费xxxx性欧美18vr| 精品一区二区三区日韩| 久久99精品国产| 国产自产视频一区二区三区| 国产在线乱码一区二区三区| 国产在线播放一区二区三区| 国产成人精品综合在线观看| av在线综合网| 欧美在线小视频| 欧美一区二区三区在线| 精品日产卡一卡二卡麻豆| 国产片一区二区| 亚洲欧美一区二区三区国产精品| 亚洲自拍偷拍欧美| 免费亚洲电影在线| 国产成人免费在线视频| 91在线观看免费视频| 欧美日韩在线三级| 日韩色视频在线观看| 国产亚洲制服色| 一区二区免费视频| 麻豆精品精品国产自在97香蕉| 国产福利一区在线| 欧洲另类一二三四区| 日韩色视频在线观看| 国产精品久久久久影视| 午夜精品国产更新| 国产乱码精品一区二区三区av| 成人黄色国产精品网站大全在线免费观看 | 国产成人丝袜美腿| 欧洲精品一区二区三区在线观看| 欧美一级在线观看| 中文字幕亚洲欧美在线不卡| 亚洲va在线va天堂| 国产a区久久久| 欧美日韩一区二区在线观看| 亚洲精品一区二区三区99| 亚洲品质自拍视频| 捆绑紧缚一区二区三区视频| www.日韩大片| 精品久久人人做人人爱| 亚洲精品国产精品乱码不99| 精品一区二区日韩| 欧美色图一区二区三区| 久久先锋影音av| 亚洲不卡在线观看| 99久久伊人精品| ww亚洲ww在线观看国产| 天堂在线亚洲视频| 91丨九色丨国产丨porny| 精品乱人伦小说| 亚洲成人综合视频| 亚洲三级久久久| 亚洲人成人一区二区在线观看| 久88久久88久久久| 欧美日韩精品一区二区天天拍小说 | 欧美大片一区二区| 亚洲一区二区视频在线观看| 国产suv精品一区二区883| 91麻豆精品国产91久久久久久| 亚洲三级免费电影| 成人高清视频在线观看| 精品美女在线观看| 日韩激情一二三区| 欧美亚一区二区| 一区精品在线播放| 成人av在线一区二区| 久久久99久久精品欧美| 久久精品免费看| 日韩三级在线观看| 亚洲成av人片一区二区梦乃| 一本色道亚洲精品aⅴ| 亚洲欧洲精品一区二区三区 | 欧美一个色资源| 午夜欧美大尺度福利影院在线看 | 亚洲va国产va欧美va观看| 色婷婷久久综合| 亚洲欧美偷拍三级| 99v久久综合狠狠综合久久| 国产女人18毛片水真多成人如厕| 精品写真视频在线观看| 精品福利在线导航| 久久er精品视频| 精品美女在线播放| 国产一区二区三区| 久久夜色精品国产噜噜av| 精品亚洲国产成人av制服丝袜 | 午夜精品久久久久久久蜜桃app| 色悠悠亚洲一区二区| 亚洲激情自拍视频| 在线观看91视频| 午夜精品久久久久久久99水蜜桃| 欧美日韩综合色| 日韩精品亚洲专区| 日韩三区在线观看| 国产精品综合视频| 国产精品久久久久精k8| 91国偷自产一区二区三区成为亚洲经典 | 日韩极品在线观看| 日韩欧美一级片| 乱中年女人伦av一区二区| 中文字幕亚洲欧美在线不卡| fc2成人免费人成在线观看播放 | 色综合咪咪久久| 亚洲一区av在线| 欧美一区二区三区男人的天堂| 奇米一区二区三区av| 久久精品亚洲乱码伦伦中文| av中文字幕亚洲| 午夜精品福利久久久| 精品88久久久久88久久久| 成人午夜短视频| 亚洲成av人影院| 久久噜噜亚洲综合| 色综合久久久久网| 免费一级片91|