摘要:適配器的適用場景代碼的復(fù)用性強(qiáng)??蛻舳耸褂媚繕?biāo)接口,與和目標(biāo)接口一致的對象合作。被適配者一個現(xiàn)存需要適配的接口。適配器負(fù)責(zé)將的接口轉(zhuǎn)換為的接口。適配器是一個具體的類,這是該模式的核心。適配器分為類適配器和對象適配器兩種,下面將詳細(xì)講述。
適配器的適用場景
代碼的復(fù)用性強(qiáng)。
我們一直在使用適配器,如果 只有USB連接頭,無法將手機(jī)插到標(biāo)準(zhǔn)的插座上面充電 ,這時(shí)需要的一個適配器,一端接USB連接頭,另一端接插座
活動專題,例抽獎,固定的規(guī)則是充值有抽獎機(jī)會,但是突然來了一個需求說充值還要分享才能有抽獎機(jī)會,這時(shí)可以運(yùn)用上這個設(shè)計(jì)模式
案例一(來自于php 設(shè)計(jì)模式 書) - 假設(shè)一個企業(yè)網(wǎng)站同時(shí)銷售軟件服務(wù)和軟件產(chǎn)品,目前所有的交易都在美國進(jìn)行,后續(xù)業(yè)務(wù)決定向歐洲發(fā)展要增加貨幣換算(增加適配器)
案例二是自已設(shè)計(jì)于活動專題業(yè)務(wù)上,只是將邏輯摘取出來,代碼不可直接運(yùn)行
優(yōu)點(diǎn)靈活性擴(kuò)展性都很好
將目標(biāo)類和適配者類解耦
適配器所涉及的角色包括下面幾種:目標(biāo)(Target):定義一個客戶端使用的特定接口。
客戶端(Client):使用目標(biāo)接口,與和目標(biāo)接口一致的對象合作。
被適配者(Adaptee):一個現(xiàn)存需要適配的接口。
適配器(Adapter):負(fù)責(zé)將Adaptee的接口轉(zhuǎn)換為Target的接口。適配器是一個具體的類,這是該模式的核心。
適配器分為類適配器和對象適配器兩種,下面將詳細(xì)講述。
來自 php 設(shè)計(jì)模式 一書的適配器設(shè)計(jì)模式案例**
/** * EuroCalc.php * 美元 - 能累加購買的服務(wù)和產(chǎn)品的價(jià)格 來自于php 設(shè)計(jì)模式 */ 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->requestCount(); } private function requestCount() { $this->dollar *= $this->rate; return $this->dollar; } } /** * EuroCalc.php * 歐元 - 能累加購買的服務(wù)和產(chǎn)品的價(jià)格 */ 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->requestCount(); } private function requestCount() { $this->euro *= $this->rate; return $this->euro; } } /** * 接口 ITarget.php */ interface ITarget { function requester(); } /** * 例:找一個合適的適配器來適合歐洲的插座一樣,以下就是創(chuàng)建這個適配器 * EuroAdapter 實(shí)現(xiàn)了一個接口又?jǐn)U展了一個類 */ class EuroAdapter extends EuroCalc implements ITarget { public function __construct() { $this->requester(); } public function requester() { $this->rate = 0.8111; return $this->rate; } } /** * 用戶 */ class Client { private $euroRequest; private $dollarRequest; public function __construct() { $this->euroRequest = new EuroAdapter(); $this->dollarRequest = new DollarCalc(); $euros = "€"; echo "Euros:$euros".$this->makeAdapterRequest($this->euroRequest)."案例二 個人運(yùn)用于自動化活動專題的接口設(shè)計(jì)
"; echo "dollar:".$this->makeDollarRequest($this->dollarRequest); } public function makeAdapterRequest(ITarget $req) { return $req->requestCalc(40,50); } public function makeDollarRequest(DollarCalc $req) { return $req->requestCalc(40,50); } } $worker = new Client();
抽獎例子(代碼只顯示對應(yīng)的設(shè)計(jì)邏輯部分)
hd_info = ""; } public function _lottery() { // 實(shí)例 $lottery = new LotteryAdapter($hd_info); // 取得抽獎結(jié)果 $rs = $lottery->_getLotteryResult(); return $rs; } } namespace controller; use btsApp as BaseApp; /** * */ class LotteryAdapter extends AutoLottery implements ILottery { public function __construct($hd_info) { // 后臺配置是否需要使用適配器 if($hd_info["use_adapter"] === true) { $adapter_name = $hd_info["adapter_name"]; // $adapter_name = "adapter_name"; test $this->$adapter_name(); } } /** * adapter_name 該活動對應(yīng)的適配器 */ private function adapter_name() { // 假設(shè)不符合自動化的需求條件是必須進(jìn)入游戲后5分才可抽獎,增加適配器的該內(nèi)容即可,從而不用重寫整個抽獎活動 $game_info = App::$app->model()->checkEnterGameInfo(); if(strtotime($info["TIME"]) - time() < 300) { $this->adapter_status = false; $this->adapter_code = -51; } } } namespace controller; use btsApp as BaseApp; /** * 自動化抽獎接口的基類 */ class AutoLottery { // 多帶帶開發(fā)條件的狀態(tài) public $adapter_status = true; public $adapter_code = 0; public function _getLotteryResult(){ // 最后判斷適配器的狀態(tài) if(!$this->adapter_status) { App::jetJsonpOutput($this->adapter_return_code); } // 業(yè)務(wù)邏輯判斷 // 通過則將數(shù)據(jù)入庫 $rs_status = App::$app->model()->insert($rs); // 返回結(jié)果 return $rs; } } ?>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/22579.html
.markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body...
摘要:月日消息,近日,中國信息通信研究院大數(shù)據(jù)產(chǎn)品能力評測數(shù)據(jù)庫方向的測評結(jié)果陸續(xù)出爐。月日消息,國家工業(yè)信息安全發(fā)展研究中心發(fā)布電信行業(yè)數(shù)據(jù)庫產(chǎn)品第一期測評結(jié)果,前三名分別是阿里云數(shù)據(jù)庫柏睿數(shù)據(jù)企業(yè)級交易型數(shù)據(jù)庫信創(chuàng)版云和恩墨企業(yè)級數(shù)據(jù)庫。 .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-si...
摘要:用友網(wǎng)絡(luò)山東區(qū)作為推動山東企業(yè)上云的主力服務(wù)商,參展了此次活動。用友云,是用友時(shí)期的核心產(chǎn)品,致力于以平臺模式為企業(yè)提供社會化云服務(wù)助力企業(yè)數(shù)字化轉(zhuǎn)型。用友云幫助企業(yè)實(shí)現(xiàn)敏經(jīng)營輕管理易金融簡,從而最終實(shí)現(xiàn)增長收入降低成本提高效率控制風(fēng)險(xiǎn)。3月7日上午,由濟(jì)南市經(jīng)信委、市財(cái)政局與高新區(qū)機(jī)關(guān)黨委主辦的云行齊魯之濟(jì)南站暨高新區(qū)創(chuàng)新論壇在濟(jì)南禧悅東方酒店順利召開。本次活動是今年企業(yè)上云第一次重大活動...
摘要:掃描下方二維碼可觀看視頻回放,獲取講師合集活動回顧來自技術(shù)中臺研發(fā)部的安雪艷介紹了基于打造的技術(shù)平臺。未來英特爾將與一起,共同利用并發(fā)揮云原生的價(jià)值,為處在數(shù)字化型中的用戶,提供更加豐富的云化策略。 ...
摘要:徐亮厚稱,當(dāng)前云原生已成為業(yè)務(wù)發(fā)展的一個重要引擎,年疫情更是加大了對的需求,拉動了大數(shù)據(jù)數(shù)據(jù)庫中間件人工智能的云原生化發(fā)展。未來英特爾將與一起,共同利用并發(fā)揮云原生的價(jià)值,為處在數(shù)字化型中的用戶,提供更加豐富的云化策略。 9月11日,由UCloud優(yōu)刻得主辦的UCan技術(shù)開放日活動上,以構(gòu)建云原生,擁抱新增長為主題,UCloud攜手達(dá)達(dá)集團(tuán)、馭勢科技、企源科技以及英特爾等企業(yè)的云原生技術(shù)專...
閱讀 3552·2019-08-30 15:53
閱讀 3463·2019-08-29 16:54
閱讀 2252·2019-08-29 16:41
閱讀 2527·2019-08-23 16:10
閱讀 3433·2019-08-23 15:04
閱讀 1429·2019-08-23 13:58
閱讀 415·2019-08-23 11:40
閱讀 2509·2019-08-23 10:26