最近需要對接第三方獨立平臺的推送訂單,同步庫存以及同步包裹信息娜搂∏考慮不同平臺數(shù)據(jù)接口的差異,以及我們自有系統(tǒng)的維護便利性百宇,這里采用了適配器模式來處理。
何為適配器模式:其核心思想把對某些相似的類的操作轉(zhuǎn)化為一個統(tǒng)一的“接口”(這里是比喻的說話)–適配器秘豹,或者比喻為一個“界面”携御,統(tǒng)一或屏蔽了那些類的細節(jié)。適配器模式還構(gòu)造了一種“機制”,使“適配”的類可以很容易的增減啄刹,而不用修改與適配器交互的代碼涮坐,符合“減少代碼間耦合”的設(shè)計原則。
最常見的例子就是我們的電源轉(zhuǎn)換插頭誓军,不同伏的電源袱讹,不同的類型電器(有些需要5伏,有些需要10伏)昵时,但是只需要一個電源轉(zhuǎn)換器捷雕,它們就可以適配使用。廢話少說壹甥,上代碼:
獲取本地數(shù)據(jù)救巷,封裝成獨立的對象放置在trait中:
trait GetBaseData
{
public function getPayOrders($providerId, $startTime = 1489680000);
public function getProductSku($providerId);
public function getUnshipOrder($providerId);
}
由于PHP不像Java可以使用對象的引用,可以在運行時決定具體使用哪個子類的方法句柠。但是由于它是弱類型浦译,可以采用變相的方式來達到多態(tài)的效果。本例中使用一個通用類來處理真正的實現(xiàn)溯职。
class ApiInterface
{
public function syncOrder($obj, $data)
{
$orderInfo = $obj->packOrderData($data);
$output = $obj->syncOrderInfo($orderInfo);
$result = $obj->parseOrderResult($output);
return $result;
}
public function pullGoods($obj, $data)
{
$goodsInfo = $obj->packGoodsData($data);
$output = $obj->pullGoodsInfo($goodsInfo);
$result = $obj->parseGoodsResult($output);
return $result;
}
public function pullShip($obj, $data)
{
$goodsInfo = $obj->packShipData($data);
$output = $obj->pullShipInfo($goodsInfo);
$result = $obj->parseShipResult($output);
return $result;
}
}
通過通用接口精盅,我們可以統(tǒng)一調(diào)用不需要改外層調(diào)用的地方。代碼調(diào)用處可以將真正的執(zhí)行對象傳入谜酒,類似于這樣操作渤弛。
$apiInterface = new ApiInterface();$retMsg = $apiInterface->syncOrder($obj, $item);
至于外層調(diào)用這個$obj如何獲得,我們就可以使用工廠模式來獲得甚带,具體適配的代碼也是工廠模式中來匹配到對應(yīng)的執(zhí)行類她肯。下面給出其中一個適配類的實現(xiàn)。
class FuHeLe implements BaseInterface
{
private $allianceCode = '';
private $requestTime = '';
private $secretKey = '';
private $sign = '';
//靜態(tài)變量保存全局實例
private static $_instance = null;
//私有構(gòu)造函數(shù)鹰贵,防止外界實例化對象
private function __construct()
{
*******
}
//私有克隆函數(shù)晴氨,防止外辦克隆對象
private function __clone() {}
//靜態(tài)方法,單例統(tǒng)一訪問入口
public static function getInstance() {
if (is_null ( self::$_instance ) || isset ( self::$_instance )) {
self::$_instance = new self ();
}
return self::$_instance;
}
public function packOrderData($item)
{
********
}
public function packGoodsData($sku)
{
********
}
public function packShipData($item)
{
********
}
public function syncOrderInfo($orderInfo)
{
********
}
public function pullGoodsInfo($sku)
{
*********
}
public function pullShipInfo($orderInfo)
{
********
}
public function parseOrderResult($retXml)
{
********
}
public function parseGoodsResult($retXml)
{
*********
}
public function parseShipResult($retXml)
{
**********
}
}
這個適配類處理每個同步功能都處理成三個函數(shù):封裝數(shù)據(jù)(packOrderData), 請求第三方平臺(syncOrderInfo)碉输,以及解析數(shù)據(jù)(parseOrderResult)籽前。這個類的代碼就是以后對接其它平臺需要著重處理的類,至于根據(jù)返回值來做自有系統(tǒng)的業(yè)務(wù)邏輯也是可以獨立被封裝成trait敷钾。
trait HandleResult
{
use LogApiStatic;
public function updSyncOrder($retMsg, $item);
public function updSyncGoods($retMsg, $item, $barCodeArr);
public function updSyncShip($retMsg, $item, $pStr);
}
采用這樣適配器模式的好處在于枝哄,開發(fā)人員只需要著重編寫適配類即可,而且維護方便阻荒。功能代碼能夠有更好的耦合性挠锥,數(shù)據(jù)隔離性做的更好。
大家喜歡可以訪問我的個人網(wǎng)站:http://www.yingminxing.com
如有疑問侨赡,歡迎溝通交流:QQ:370399195, 微信:yingminxing1988