主頁(yè) > 知識(shí)庫(kù) > php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解

php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解

熱門標(biāo)簽:青白江地圖標(biāo)注 聊城電話外呼系統(tǒng)公司 銅川電話機(jī)器人價(jià)格 沛縣400電話辦理 德陽(yáng)中江如何申請(qǐng)400開頭電話 AI電話機(jī)器人OEM貼牌 智能電話機(jī)器人好公司門薩維 辦理重慶400電話 江蘇電商外呼系統(tǒng)運(yùn)營(yíng)商

本文實(shí)例講述了php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)。分享給大家供大家參考,具體如下:

在這個(gè)有沒有對(duì)象都要高呼“面向?qū)ο蟆钡哪甏莆彰嫦驅(qū)ο髸?huì)給我們帶來(lái)意想不到的方便。學(xué)編程的小伙伴從開始能寫幾行代碼實(shí)現(xiàn)簡(jiǎn)單功能到后來(lái)懂得將一些重復(fù)的操作組合起來(lái)形成一個(gè)“函數(shù)”,再到后來(lái)將“函數(shù)”和屬性組合起來(lái)形成一個(gè)“類”。一步步走來(lái),我們?cè)诳紤]著機(jī)器運(yùn)行代碼效率的提高的同時(shí)也在考慮減輕程序員的工作量。 那么我們今天講到的適配器模型更著重考慮的是什么呢?是程序員工作量。

什么時(shí)候會(huì)用到適配器模式?

其實(shí)最簡(jiǎn)單的例子是當(dāng)我們引用一個(gè)第三方類庫(kù)。這個(gè)類庫(kù)隨著版本的改變,它提供的API也可能會(huì)改變。如果很不幸的是,你的應(yīng)用里引用的某個(gè)API已經(jīng)發(fā)生改變的時(shí)候,除了在心中默默地罵“wocao”之外,你還得去硬著頭皮去改大量的代碼。

難道真的一定要如此嗎?按照套路來(lái)說(shuō),我會(huì)回答“不是的”。我們有適配器模式啊~~

當(dāng)接口發(fā)生改變時(shí),適配器模式就派上了用場(chǎng)。

舉個(gè)栗子

如果通過(guò)上面的簡(jiǎn)單描述,你都能懂,那在下只能佩服你的領(lǐng)悟能力超群了。一般人一定還是不知所云。為了方便理解,我引用一位博友的例子。原文地址。

一開始的和諧

黑棗玩具公司專門生產(chǎn)玩具,生產(chǎn)的玩具不限于狗、貓、獅子,魚等動(dòng)物。每個(gè)玩具都可以進(jìn)行“張嘴”與“閉嘴”操作,分別調(diào)用了openMouth與closeMouth方法。

在這個(gè)時(shí)候,我們很容易想到可以第一定義一個(gè)抽象類Toy,甚至是接口Toy,這些問題不大,其他的類去繼承父類,實(shí)現(xiàn)父類的方法。一片和諧,信心向榮。

平衡的破壞

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

考慮實(shí)現(xiàn)的方法時(shí),我們很直接地想到,你需要的話我再在我的父類子類里給你添加這么兩個(gè)方法就好啦。當(dāng)你一次又一次在父類子類里面重復(fù)添加著這兩個(gè)方法的時(shí)候,總會(huì)想著如此重復(fù)的工作,難道不能解決么?當(dāng)有數(shù)百個(gè)子類的時(shí)候,程序員會(huì)改瘋的。程序員往往比的是誰(shuí)在不影響效率的時(shí)候更會(huì)“偷懶”。這樣做下去程序員會(huì)覺得自己很傻。(其實(shí)我經(jīng)常當(dāng)這樣的傻子)

abstract class Toy
{
  public abstract function openMouth();
  public abstract function closeMouth();
  //為紅棗遙控公司控制接口增加doMouthOpen方法
  public abstract function doMouthOpen();
  //為紅棗遙控公司控制接口增加doMouthClose方法
  public abstract function doMouthClose();
}
class Dog extends Toy
{
  public function openMouth()
  {
    echo "Dog open Mouth\n";
  }
  public function closeMouth()
  {
    echo "Dog open Mouth\n";
  }
  //增加的方法
  public function doMouthOpen()
  {
    $this->doMouthOpen();
  }
  //增加的方法
  public function doMouthClose()
  {
    $this->closeMouth();
  }
}
class Cat extends Toy
{
  public function openMouth()
  {
    echo "Cat open Mouth\n";
  }
  public function closeMouth()
  {
    echo "Cat open Mouth\n";
  }
  //增加的方法
  public function doMouthOpen()
  {
    $this->doMouthOpen();
  }
  //增加的方法
  public function doMouthClose()
  {
    $this->closeMouth();
  }
}

更加煩躁

程序員剛剛碼完代碼,喝了口水,突然間另一個(gè)消息傳來(lái)。

黑棗玩具公司也要與綠棗遙控公司合作,因?yàn)榫G棗遙控公司遙控設(shè)備更便宜穩(wěn)定。不過(guò)綠棗遙控公司的遙控設(shè)備是調(diào)用的動(dòng)物的operMouth(type)方法來(lái)實(shí)現(xiàn)嘴巴控制。如果type)方法來(lái)實(shí)現(xiàn)嘴巴控制。如果type為0則“閉嘴”,反之張嘴。

這下好了,程序員又得對(duì)Toy及其子類進(jìn)行升級(jí),使Toy能調(diào)用operMouth()方法。擱誰(shuí)都不淡定了。

abstract class Toy
{
  public abstract function openMouth();
  public abstract function closeMouth();
  public abstract function doMouthOpen();
  public abstract function doMouthClose();
  //為綠棗遙控公司控制接口增加doMouthClose方法
  public abstract function operateMouth($type = 0);
}
class Dog extends Toy
{
  public function openMouth()
  {
    echo "Dog open Mouth\n";
  }
  public function closeMouth()
  {
    echo "Dog open Mouth\n";
  }
  public function doMouthOpen()
  {
    $this->doMouthOpen();
  }
  public function doMouthClose()
  {
    $this->closeMouth();
  }
  public function operateMouth($type = 0)
  {
    if ($type == 0) {
      $this->closeMouth();
    } else {
      $this->operateMouth();
    }
  }
}
class Cat extends Toy
{
  public function openMouth()
  {
    echo "Cat open Mouth\n";
  }
  public function closeMouth()
  {
    echo "Cat open Mouth\n";
  }
  public function doMouthOpen()
  {
    $this->doMouthOpen();
  }
  public function doMouthClose()
  {
    $this->closeMouth();
  }
  public function operateMouth($type = 0)
  {
    if ($type == 0) {
      $this->closeMouth();
    } else {
      $this->operateMouth();
    }
  }
}

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

問題在出在哪里呢?

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

在這種想法下,我們懂得了如何去用繼承,如何利用多態(tài),甚至如何實(shí)現(xiàn)“高內(nèi)聚,低耦合”。

回到這個(gè)問題,我們現(xiàn)在面臨這么一個(gè)問題,新的接口方法我要實(shí)現(xiàn),舊的接口(Toy抽象類)也不能動(dòng),那么總得有個(gè)解決方法吧。那就是引入一個(gè)新的類--我們本文的主角--適配器。  適配器要完成的功能很明確,引用現(xiàn)有接口的方法實(shí)現(xiàn)新的接口的方法。更像它名字描述的那樣,你的接口不改的話,我就利用現(xiàn)有接口和你對(duì)接一下吧。

到此,解決方法已經(jīng)呼之欲出了,下面貼上代碼。

?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();

最后的結(jié)果就是,Toy類及其子類在不改變自身的情況下,通過(guò)適配器實(shí)現(xiàn)了不同的接口。

最后總結(jié)

將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,使用原本不兼容的而不能在一起工作的那些類可以在一起工作.

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

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

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

您可能感興趣的文章:
  • PHP設(shè)計(jì)模式之適配器模式(Adapter)原理與用法詳解
  • php設(shè)計(jì)模式 Adapter(適配器模式)
  • PHP設(shè)計(jì)模式之適配器模式代碼實(shí)例
  • 學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)適配器模式
  • PHP設(shè)計(jì)模式之適配器模式原理與用法分析
  • 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)型】

標(biāo)簽:赤峰 鷹潭 濟(jì)寧 南寧 三亞 迪慶 烏魯木齊 山南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解》,本文關(guān)鍵詞  php,設(shè)計(jì)模式,之,適配器,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章