比如在 DSP 广告投放过程中,对百度 BES AdX 渠道返回广告,调用 $Baidu->sendResponse($material); 就可以给 AdX 提供物料的参与竞价响应,但过一阵子,又要对接其他渠道,或者这个方法名变了…… 显然将每个调用这个代码的地方都改一次是不现实也不优雅的,这个时候就可以考虑使用适配器模式封装。
class BaiduBES{
public function sendResponse($material){
echo "...".$material;
}
}
class GoogleAdX{
public function doRes($material){
echo "...".$material;
}
}
PHP 调用方式:
$baidu = new BaiduBES();
$baidu->sendResponse('xxx');//返回物料响应给百度 BES ADX
$google = new GoogleAdX();
$google->doRes('xxx');//返回物料响应给 Google AdX
class Adapter implements AdResponseMethod{
private $adapter;
function __construct($adaptee){
$this->adapter = $adaptee;
}
public function response($material){
//判断是哪个类
$className = get_class($this->adapter);
if($className == "BaiduBES"){
$this->adapter->sendResponse($material);
}elseif ($className == "GoogleAdX") {
$this->adapter->doRes($material);
}
}
}
PHP 调用方式:
$baidu = new BaiduBES();
$adapter = new Adapter($baidu);
$adapter->response('xxx');//通过百度 BES 响应广告请求
$google = new GoogleAdX();
$adapter = new Adapter($google);
$adapter->response('xxx');//通过 GoogleAdX 响应广告
或者直接将类的声明封装在适配器的内部:
class Adapter implements AdResponseMethod{
private $adapter;
function __construct($className){
if(strtolower($className) == "baidubes"){
$this->adapter = new BaiduBES();
}elseif (strtolower($className) == "googleadx") {
$this->adapter = new GoogleAdX();
}
}
public function response($material){
//判断是哪个类
$className = get_class($this->adapter);
if($className == "BaiduBES"){
$this->adapter->sendResponse($material);
}elseif ($className == "GoogleAdX") {
$this->adapter->doRes($material);
}
}
}
PHP 调用方式:
$adapter = new Adapter('baidubes');
$adapter->response('xxx');//通过百度 BES 响应广告请求
$adapter = new Adapter('googleadx');
$adapter->response('xxx');//通过 GoogleAdX 响应广告
<?php
//目标
interface AdResponse{
public function bidRequest();
public function bidResponse();
}
//适配器
class AdManager implements AdResponse {
private $adProxy;
function __construct($adx_name){
$cls = strtolower($adx_name);
switch($cls){
case 'baidu':
$this->adProxy = new Baidu();
break;
case 'google':
$this->adProxy = new Google();
break;
default:
break;
}
// print_r($this->adProxy);
}
public function bidRequest(){
echo "BidRequest";
}
public function bidResponse(){
switch (strtolower(get_class($this->adProxy))){
case 'baidu':
$this->adProxy->sendBaidu();
break;
case 'google':
$this->adProxy->sendGoogle();
break;
default:
break;
}
}
}
class Baidu {
public function sendBaidu(){
echo "Baidu Bid Response";
}
}
class Google {
public function sendGoogle(){
echo "Google Bid Response!";
}
}
PHP 调用方式:
<?php
$adx = new AdManager('baidu');
$adx->bidResponse();
echo "<hr>";
$adx = new AdManager('google');
$adx->bidResponse();