中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php中適配器模式的原理是什么

發布時間:2021-05-12 16:48:27 來源:億速云 閱讀:77 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關php中適配器模式的原理是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

什么時候會用到適配器模式?

其實最簡單的例子是當我們引用一個第三方類庫。這個類庫隨著版本的改變,它提供的API也可能會改變。如果很不幸的是,你的應用里引用的某個API已經發生改變的時候,除了在心中默默地罵“wocao”之外,你還得去硬著頭皮去改大量的代碼。

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

當接口發生改變時,適配器模式就派上了用場。

舉個栗子

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

一開始的和諧

黑棗玩具公司專門生產玩具,生產的玩具不限于狗、貓、獅子,魚等動物。每個玩具都可以進行“張嘴”與“閉嘴”操作,分別調用了openMouth與closeMouth方法。

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

平衡的破壞

為了擴大業務,現在黑棗玩具公司與紅棗遙控公司合作,紅棗遙控公司可以使用遙控設備對動物進行嘴巴控制。不過紅棗遙控公司的遙控設備是調用的動物的doMouthOpen及doMouthClose方法。黑棗玩具公司的程序員現在必須要做的是對Toy系列類進行升級改造,使Toy能調用doMouthOpen及doMouthClose方法。

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

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

更加煩躁

程序員剛剛碼完代碼,喝了口水,突然間另一個消息傳來。

黑棗玩具公司也要與綠棗遙控公司合作,因為綠棗遙控公司遙控設備更便宜穩定。不過綠棗遙控公司的遙控設備是調用的動物的operMouth(type)方法來實現嘴巴控制。如果type)方法來實現嘴巴控制。如果type為0則“閉嘴”,反之張嘴。

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

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

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

問題在出在哪里呢?

像上面那樣編寫代碼,代碼實現違反了“開-閉”原則,一個軟件實體應當對擴展開放,對修改關閉。即在設計一個模塊的時候,應當使這個模塊可以在不被修改的前提下被擴展。也就是說每個尸體都是一個小王國,你讓我參與你的事情這個可以,但你不能修改我的內部,除非我的內部代碼確實可以優化。

在這種想法下,我們懂得了如何去用繼承,如何利用多態,甚至如何實現“高內聚,低耦合”。

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

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

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

php有什么用

php是一個嵌套的縮寫名稱,是英文超級文本預處理語言,它的語法混合了C、Java、Perl以及php自創新的語法,主要用來做網站開發,許多小型網站都用php開發,因為php是開源的,從而使得php經久不衰。

關于php中適配器模式的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

平定县| 西吉县| 呼玛县| 连城县| 区。| 汝南县| 虞城县| 钦州市| 宜春市| 化隆| 舟曲县| 彝良县| 津市市| 延寿县| 德格县| 准格尔旗| 甘孜县| 深水埗区| 济宁市| 关岭| 呼图壁县| 方正县| 乾安县| 邳州市| 五莲县| 拜泉县| 汉沽区| 牙克石市| 淳化县| 旬邑县| 张家界市| 长寿区| 吴江市| 天水市| 大化| 吉水县| 肃南| 广饶县| 托克托县| 永仁县| 务川|