婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP設計模式之適配器模式定義與用法詳解

PHP設計模式之適配器模式定義與用法詳解

熱門標簽:寧波外呼營銷系統 長沙做地圖標注公司 房產中介用的是什么外呼系統 福建銀行智能外呼系統價格 電話機器人銷售主要負責什么 四川保險智能外呼系統供應商 上海做外呼線路的通信公司 遼寧ai電銷機器人價格 地圖標注專員怎么樣

本文實例講述了PHP設計模式之適配器模式定義與用法。分享給大家供大家參考,具體如下:

適配器很容易理解, 大多數人家庭都有手機轉接器, 用來為移動電話充電,這就是一種適配器. 如果只有USB接頭, 就無法將移動電話插到標準插座上. 實際上, 必須使用一個適配器, 一端接USB插頭, 一端接插座. 當然, 你可以拿出電氣工具,改裝USB連接頭, 或者重新安裝插座, 不過這樣會帶來很多額外的工作, 而且可能會把連接頭或插座弄壞. 所以, 最可取的方法就是找一個適配器. 軟件開發也是如此.

類適配器模式(使用繼承)

類適配器模式很簡單, 不過與對象適配器模式相比, 類適配器模式的靈活性弱些, 類適配器簡單的原因在于 , 適配器(Adapter)會從被適配者(Adaptee)繼承功能, 所以適配模式中需要編寫的代碼比較少.

由于類適配器模式包含雙重繼承, 但是PHP并不支持雙重繼承, 不過幸運的是,PHP可以用接口來模擬雙重繼承, 下面是一個正確的結構, 不僅繼承了一個類, 同時還繼承了一個接口

class ChildClass extends ParentClass implements ISomeAdapter
{
}

實現類適配器模式時, 參與者必須包括一個PHP接口

下面以一個貨幣兌換為例來演示:

假設有一個企業網站在同時銷售軟件服務和軟件產品, 目前, 所有交易都在美國進行, 所以完全可以用美元來完成所有計算.現在開發人員希望能有一個轉換器能處理美元和歐元的兌換, 而不改變原來按美元交易額的類.通過增加一個適配器, 現在程序即可以用美元計算也可以用歐元計算.

DollarCalc.php

?php
class DollarCalc
{
 private $dollar;
 private $product;
 private $service;
 public $rate = 1;
 public function requestCalc($productNow, $serviceNow)
 {
  $this->product = $productNow;
  $this->service = $serviceNow;
  $this->dollar = $this->product + $this->service;
  return $this->requestTotal();
 }
 public function requestTotal()
 {
  $this->dollar *= $this->rate;
  return $this->dollar;
 }
}

查看這個類,可以看到其中有一個屬性$rate,requestTotal()方法使用$rate計算一次交易的金額.在這個版本中, 這個值設置為1,實際上總金額無需再乖以兌換率, 不過如果要為客戶提供折扣或者要增加額外服務或產品的附加費, $rate變量會很方便. 這個類并不是適合器模式的一部分, 不過這是一個起點.

需求變化了

現在客戶的公司要向歐洲發展,所以需要開發一個應用, 能夠用歐元完成同樣的計算. 你希望這個歐元計算能夠像DollarCalc一樣, 所要做的就是改變變量名.

EuroCalc.php

?php
class EuroCalc
{
 private $euro;
 private $product;
 private $service;
 public $rate = 1;
 public function requestCalc($productNow, $serviceNow)
 {
  $this->product = $productNow;
  $this->service = $serviceNow;
  $this->euro = $this->product + $this->service;
  return $this->requestTotal();
 }
 public function requestTotal()
 {
  $this->euro *= $this->rate;
  return $this->euro;
 }
}

接下來, 再把應用的其余部分插入到EuroCalc類中. 不過,因為客戶的所有數據都是按美元計算的.換句話說, 如果不重新開發整個程序, 就無法在系統中"插入"這個歐元計算. 但是你不想這么做. 為了加入EuroCalc, 你需要一個適配器: 就像找一個適配器來適應歐洲的插座一樣, 可以創建一個適配器, 使你的系統能夠使用歐元. 幸運的是, 類適配器正是為這樣的情況設計的.首先需要創建一個接口. 在這個類圖中, 這個接口名為ITarget. 它只有一個方法requester(). requester()是一個抽象方法, 要由接口的具體實現來實現這個方法.

ITarget.php

?php
interface ITarget
{
 public function requester();
}

現在開發人員可以實現requester()方法, 請求歐元而不是美元.

在使用繼承的適配器設計模式中, 適配器(Adapter)參與都既實現ITarget接口,還實現了具體類EuroCalc. 創建EuroAdapter不需要做太多工作, 因為大部分工作已經在EuroCal類中完成.現在要做的就是實現request()方法, 使它能把美元值轉換為歐元值.

EuroAdapter.php

?php
include_once('EuroCalc.php');
include_once('ITarget.php');
class EuroAdapter extends EuroCalc implements ITarget
{
 public function __construct()
 {
  $this->requester();
 }
 public function requester()
 {
  $this->rate = 0.8111;
  return $this->rate;
 }
}

類適配模式中, 一個具體類會繼承另一個具體類, 有這種結構的設計模式很少見, 大多數設計模式中, 幾乎都是繼承一個抽象類, 并由類根據需要實現其抽象方法和屬性. 換句話說, 一般談到繼承時, 都是具體類繼承抽象類.

由于既實現了一個接口又擴展了一個類, 所以EuroAdapter類同時擁有該接口和具體類的接口. 通過使用requester()方法, EuroAdapter類可以設置rate值(兌換率), 從而能使用被適配者的功能, 而元而做任何改變.

下面定義一個Client類, 從EuroAdapter和DollarCalc類發出請求. 可以看到,原來的DollarCalc仍能很好地工作, 不過它沒有ITarget接口.

Client.php

?php
include_once('EuroAdapter.php');
include_once('DollarCalc.php');
class Client
{
 public function __construct()
 {
  $euro = '€';
  echo "區元: $euro" . $this->makeApapterRequest(new EuroAdapter()) . 'br />';
  echo "美元: $: " . $this->makeDollarRequest(new DollarCalc()) . 'br />';
 }
 private function makeApapterRequest(ITarget $req)
 {
  return $req->requestCalc(40,50);
 }
 private function makeDollarRequest(DollarCalc $req)
 {
  return $req->requestCalc(40,50);
 }
}
$woker = new Client();

運行結果如下:

Euros: €72.999
Dollars: $: 90

可以看到,美元和歐元都可以處理, 這就是適配器模式的方便之處.

這個計算很簡單, 如果是針對更為復雜的計算, 繼承要提供建立類適配器的Target接口的必要接口和具體實現

使用組合的適配器模式

對象適配器模式使用組合而不是繼承, 不過它也會完成同樣的目標. 通過比較這兩個版本的適配器模式, 可以看出它們各自的優缺點. 采用類適配器模式時,適配器可以繼承它需要的大多數功能, 只是通過接口稍微調. 在對象適配器模式中 適配器(Adapter)參與使用被適配者(Adaptee), 并實現Target接口. 在類適配器模式中, 適配器(Adapter)則是一個被適配者(Adaptee), 并實現Target接口.

示例: 從桌面環境轉向移動環境

PHP程序員經常會遇到這樣一個問題:需要適應移動環境而做出調整.不久之前,你可能只需要考慮提供一個網站來適應多種不同的桌面環境. 大多數桌面都使用一個布局, 再由設計人員讓它更美觀. 對于移動設備, 設計人員和開發人員不僅需要重新考慮桌面和移動環境中頁面顯示的設計元素, 還要考慮如何從一個環境切換到另一個環境.

首先來看桌面端的類Desktop(它將需要一個適配器). 這個類使用了一個簡單但很寬松的接口:

IFormat.php

?php
interface IFormat
{
 public function formatCSS();
 public function formatGraphics();
 public function horizontalLayout();
}

它支持css和圖片選擇, 不過其中一個方法指示一種水平布局, 我們知道這種布局并不適用小的移動設備.下面給出實現這個接口的Desktop類

Desktop.php

?php
include_once('IFormat.php');
class Desktop implements IFormat
{
 public function formatCSS()
 {
  echo "引用desktop.cssbr />";
 }
 public function formatGraphics()
 {
  echo "引用desktop.png圖片br />";
 }
 public function horizontalLayout()
 {
  echo '桌面:水平布局';
 }
}

問題來了, 這個布局對于小的移動設備來說太寬了. 所以我們的目標是仍采用同樣的內容, 但調整為一種移動設計.

下面來看移動端的類Mobile

首先移動端有一個移動端的接口

IMobileFormat

?php
interface IMobileFormat
{
 public function formatCSS();
 public function formatGraphics();
 public function verticalLayout();
}

可以看到, IMobileFormat接口和IFormat接口是不一樣的,也就是不兼容的, 一個包含了方法horizontalLayout(), 另一個包含方法verticalLaout(), 它們的差別很小, 最主要的區別是: 桌面設計可以采用水平的多欄布局, 而移動設計要使用垂直布局,而適配器就是要解決這個問題

下面給出一個實現了IMoibleFormat接口的Mobile類

Mobile.php

?php
include_once('IMobileFormat.php');
class Mobile implements IMobileFormat
{
 public function formatCSS()
 {
  echo "引用mobile.cssbr />";
 }
 public function formatGraphics()
 {
  echo "引用mobile.png圖片br />";
 }
 public function verticalLayout()
 {
  echo '移動端:垂直布局';
 }
}

Mobile類和Desktop類非常相似, 不過是圖片和CSS引用不同

接下來,我們需要一個適配器,將Desktop和Mobile類結合在一起

MobileAdapter.php

?php
include_once('IFormat.php');
include_once('Mobile.php');
class MobileAdapter implements IFormat
{
 private $mobile;
 public function __construct(IMobileFormat $mobileNow)
 {
  $this->mobile = $mobileNow;
 }
 public function formatCSS()
 {
  $this->mobile->formatCSS();
 }
 public function formatGraphics()
 {
  $this->mobile->formatGraphics();
 }
 public function horizontalLayout()
 {
  $this->mobile->verticalLayout();
 }
}

可以看到,MobileAdapter實例化時要提供一個Mobile對象實例.還要注意 ,類型提示中使用了IMobileFormat, 確保參數是一個Mobile對象.有意思的是, Adapter參與者通過實現horizontalLayout()方法來包含verticalLayout()方法.實際上, 所有MobileAdapter方法都包裝了一個Mobile方法.碰巧的是, 適配器參與者中的一個方法并不在適配器接口中(verticalLayout());它們可能完全不同, 適配器只是把它們包裝在適配器接口(IFormat)的某一方法中.

客戶調用(Client)

Client.php

?php
include_once('Mobile.php');
include_once('MobileAdapter.php');
class Client
{
 private $mobile;
 private $mobileAdapter;
 public function __construct()
 {
  $this->mobile = new Mobile();
  $this->mobileAdapter = new MobileAdapter($this->mobile);
  $this->mobileAdapter->formatCSS();
  $this->mobileAdapter->formatGraphics();
  $this->mobileAdapter->horizontalLayout();
 }
}
$worker = new Client();

適配器模式中的Client類必須包裝Adaptee(Mobile)的一個實例, 以便集成到Adapter本身.實例化Adapter時, Client使用Adatee作為參數來完成Adapter的實例化.所以客戶必須首先創建一個Adapter對象(new Mobile()), 然后創建一個Adapter((new MobileAdapter($this->mobile)).

Client類的大多數請求都是通過MobileAdapter發出的. 不過這個代碼的最后他使用了Mobile類的實例.

適配器和變化

PHP程序員要即該面對變化.不同版本的PHP會變化, 可能增加新的功能, 另外還可能取消一些功能.而且隨著PHP的大大小小的變化,MySQL也在改變.例如, mysql的擴展包升級為mysqli, PHP開發人員需要相應調整, 要改為使用mysqli中的新API.這里適合采用適配器模式嗎?可能不適合.適配器可能適用, 可能不適用,這取決于你的程序如何配置.當然可以重寫所有連接和交互代碼, 不過這可不是適配器模式的本意, 這就像是重新安裝USB連接頭, 想把它插進標準的墻上插座一樣. 不過, 如果所有原來的mysql代碼都在模塊中, 你可以修改這個模塊(類),換入一個有相同接口的新模塊.只是要使用mysqli而不是mysql.我不認為交換等同于適配器, 不過道理是一樣的, 在適配器模式中, 原來的代碼沒有任何改變, 有變化的只是適配器.

如果需要結合使用兩個不兼容的接口, 這種情況下, 適配器模式最適用.適配器可以完成接口的"聯姻".可以把適配器看作是一個婚姻顧問;通過創建一個公共接口來克服雙方的差異.利用 這種設計模式, 可以促成二者的合作,而避免完全重寫某一部分.

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP基本語法入門教程》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • PHP設計模式之適配器模式(Adapter)原理與用法詳解
  • php設計模式 Adapter(適配器模式)
  • PHP設計模式之適配器模式代碼實例
  • 學習php設計模式 php實現適配器模式
  • PHP設計模式之適配器模式原理與用法分析
  • php設計模式之適配器模式原理、用法及注意事項詳解
  • php設計模式之適配器模式實例分析【星際爭霸游戲案例】
  • PHP設計模式(四)原型模式Prototype實例詳解【創建型】
  • PHP設計模式(三)建造者模式Builder實例詳解【創建型】
  • PHP設計模式(一)工廠模式Factory實例詳解【創建型】
  • PHP設計模式概論【概念、分類、原則等】
  • PHP設計模式(五)適配器模式Adapter實例詳解【結構型】

標簽:佛山 延安 宿遷 澳門 常德 工商登記 宜春 深圳

巨人網絡通訊聲明:本文標題《PHP設計模式之適配器模式定義與用法詳解》,本文關鍵詞  PHP,設計模式,之,適配器,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP設計模式之適配器模式定義與用法詳解》相關的同類信息!
  • 本頁收集關于PHP設計模式之適配器模式定義與用法詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91精品国产综合久久香蕉的特点 | 欧美高清dvd| 免费成人av资源网| 欧美探花视频资源| 欧美一级电影网站| 亚洲日本在线a| 欧美一区二区三区免费大片| 最新国产精品久久精品| 久久精品亚洲国产奇米99| 午夜精品久久久久久久久久| 国产精品一区一区| 成人综合婷婷国产精品久久免费| 成人欧美一区二区三区| 欧美在线视频不卡| 色综合久久88色综合天天| 天堂精品中文字幕在线| 成人午夜免费av| 2024国产精品| 国产在线视频不卡二| 日韩你懂的在线播放| 亚洲国产高清aⅴ视频| 久久精品国产久精国产| 日韩视频在线永久播放| 日韩在线卡一卡二| 91福利在线观看| 中文字幕一区二区三区色视频| 欧美美女黄视频| 色噜噜狠狠色综合欧洲selulu| www.久久久久久久久| 91在线视频播放地址| 日本亚洲天堂网| 一区二区三区在线看| 久久66热re国产| 久久精品国产999大香线蕉| 久久激五月天综合精品| 成人av影视在线观看| 欧美日韩中文字幕精品| 国产欧美一区二区精品秋霞影院| 亚洲视频一二三| 欧美日韩一卡二卡| 国产精品免费久久| 亚洲欧美日韩中文播放| 国产精品免费aⅴ片在线观看| 欧美精品电影在线播放| 成人免费视频caoporn| 在线免费视频一区二区| 成人中文字幕在线| 亚洲美女视频在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 国产亚洲一二三区| 亚洲欧洲99久久| 日本三级韩国三级欧美三级| 久久99精品国产麻豆婷婷| 欧洲在线/亚洲| 国产精品久久久久一区| 国产中文一区二区三区| 97国产精品videossex| 欧美高清一级片在线| 亚洲色图制服丝袜| 久久久久国产成人精品亚洲午夜| 久久久99精品久久| av一区二区三区在线| 久久你懂得1024| 成人app在线观看| 亚洲丝袜精品丝袜在线| 在线视频你懂得一区| 久久先锋影音av鲁色资源| 亚洲综合免费观看高清完整版在线 | 中文字幕制服丝袜一区二区三区| 欧美高清精品3d| 欧洲精品视频在线观看| 成人精品国产福利| 精品电影一区二区三区 | 精品一区中文字幕| 日韩理论片在线| 国产一区二区在线观看免费| 久久不见久久见免费视频7 | 国产在线国偷精品产拍免费yy| 精品一区精品二区高清| 日韩电影在线看| 肉丝袜脚交视频一区二区| 成人免费高清在线观看| 亚洲女爱视频在线| 精品一区二区在线免费观看| 欧美人动与zoxxxx乱| 亚洲大片精品永久免费| 青青草97国产精品免费观看| 欧美一区二区播放| 国产丶欧美丶日本不卡视频| 伊人夜夜躁av伊人久久| 精品黑人一区二区三区久久| 日本韩国欧美国产| 777奇米四色成人影色区| 免费av成人在线| 一区二区三区色| 国产精品夜夜嗨| 国产精品久久看| 精品av久久707| 日韩一区国产二区欧美三区| 在线亚洲+欧美+日本专区| 波多野结衣中文字幕一区 | 91久久精品一区二区三区| 国产麻豆欧美日韩一区| 日韩av网站在线观看| 国产精品美女久久福利网站| 久久先锋影音av| 久久久国产综合精品女国产盗摄| 日本韩国一区二区三区| 91色|porny| 91看片淫黄大片一级| 国产成人综合视频| 北岛玲一区二区三区四区| 99久久亚洲一区二区三区青草| 成人性生交大片免费看中文| 国产精品一二三在| 国产乱子伦一区二区三区国色天香| 三级一区在线视频先锋| 久久精品噜噜噜成人88aⅴ| 日本不卡在线视频| 国产成人综合精品三级| 欧洲一区在线观看| 制服丝袜日韩国产| 欧美精品在线观看播放| 日韩一区二区不卡| 欧美一区二区精品久久911| 国产欧美一区视频| 国产精品无人区| 欧美日韩大陆在线| 国产精品国产馆在线真实露脸 | 蜜桃视频在线观看一区| 国产精品一卡二| 欧美日韩激情一区二区| 国产蜜臀av在线一区二区三区| 亚洲综合在线免费观看| 国产麻豆日韩欧美久久| 国产精品久久久久久久久果冻传媒| 欧美三级视频在线观看| 91女神在线视频| 91精品国产色综合久久不卡电影| 国产午夜精品理论片a级大结局| 亚洲风情在线资源站| 成人av电影在线| 久久午夜电影网| 日本va欧美va瓶| 制服丝袜国产精品| 日韩精品一二三区| 欧美色偷偷大香| 亚洲欧美日韩在线播放| 96av麻豆蜜桃一区二区| 国产精品久久三| 高清在线观看日韩| 亚洲国产经典视频| av一区二区三区黑人| 国产精品成人在线观看| 国产激情精品久久久第一区二区 | 亚洲精品成a人| 国产麻豆午夜三级精品| 欧美成人精品1314www| 免费成人深夜小野草| 精品久久久久久久久久久久包黑料| 亚洲精品少妇30p| 国产**成人网毛片九色| 一区在线观看免费| 欧美主播一区二区三区美女| 青青草视频一区| 国产欧美日韩视频一区二区| 成年人网站91| 亚洲午夜电影网| 国产亚洲欧美激情| 91国偷自产一区二区三区成为亚洲经典| 一区二区三区在线影院| 日韩一区二区三区高清免费看看| 国产盗摄一区二区| 日韩黄色片在线观看| 一区在线观看免费| 日韩视频一区二区三区在线播放| 国产精品 日产精品 欧美精品| 一区二区三区视频在线看| 久久久亚洲精品一区二区三区| 色婷婷综合五月| 国产精品一品二品| 秋霞国产午夜精品免费视频| 亚洲欧美日韩中文播放 | 国产成人综合在线观看| 午夜精品福利久久久| 国产精品不卡视频| 久久免费看少妇高潮| 在线电影国产精品| 国产日韩欧美a| 欧美视频中文字幕| 国产精品亚洲视频| 美女高潮久久久| 另类综合日韩欧美亚洲| 丝袜美腿成人在线| 亚洲综合色网站| 亚洲国产精品欧美一二99| 亚洲色图丝袜美腿| 亚洲精品视频免费看| 亚洲国产视频直播| 午夜国产不卡在线观看视频|