簡介: 適配器模式屬於結構型設計模式。 將一個類的介面轉換成可應用的相容介面。適配器使原本由於介面不相容而不能一起工作的那些類可以一起工作。 適配器模式有兩種實現方案,一種是繼承的方式,一種是組合的方式。 適用場景: 相容不方便更改的“祖傳”代碼。 歸納具有相似點的模塊,比如Laravel File ...
簡介:
適配器模式屬於結構型設計模式。
將一個類的介面轉換成可應用的相容介面。適配器使原本由於介面不相容而不能一起工作的那些類可以一起工作。
適配器模式有兩種實現方案,一種是繼承的方式,一種是組合的方式。
適用場景:
- 相容不方便更改的“祖傳”代碼。
歸納具有相似點的模塊,比如Laravel FileSystemAdapter。
優點:
- 擴展了原有類,增強了擴展性。
- 無需修改原有代碼,符合開閉原則。
缺點:
由於PHP不支持多繼承,一次最多只能適配一個適配者類。
代碼:
//用戶類,獲取用戶信息,這是個老項目
class User {
public function getUserInfo() {
return serialize([
'id' => 1,
'name' => 'zs',
'phone' => '18888888888',
'email' => '[email protected]'
]);
}
}
//老調用埠,由於這種序列化語法是PHP特有的,但是一旦擴展調用端的種類,比如添加java,安卓調用,其它調用端的介面將無法使用,為此需要做出優化。
$user = new User();
echo $user->getUserInfo() . PHP_EOL;
//優化 使用繼承的方式
class UserAdapter1 extends User {
public function getUserInfo() {
$old_user_info = parent::getUserInfo();
return json_encode(unserialize($old_user_info));
}
}
//調用端
$user_new = new UserAdapter1();
echo $user_new->getUserInfo() . PHP_EOL;
//優化 使用組合的方式
class UserAdapter2 {
public function getUserInfo() {
$old_user_info = (new User)->getUserInfo();
return json_encode(unserialize($old_user_info));
}
}
//調用端
$user_new = new UserAdapter2();
echo $user_new->getUserInfo() . PHP_EOL;
```php