適配器設計模式只是將某個對象的接口適配為另一個對象所期望的接口。
- 假如我們原始的有一個UserInfo的類,提供用戶信息的類,早起設計該類的時候,只實現了一個getUserName獲取用戶名的方法。
- 我們的MyOldObject類中,將從UserInfo這個類中獲取用戶信息,並且輸出用戶名
- 隨著時間的推移,我們舊的UserInfo這個類只提供的獲取用戶名的方法,已經沒法滿足需求,我們同時需要獲取用戶的年齡等信息。
- 為了不改變原本UserInfo這個類,我們就繼承UserInfo,建立一個UserInfoAdapter類,實現getAge獲取年齡這樣的方法。
- 在我們的MyNewObject新的類中,我們實例化UserInfoAdapter,打印出用戶姓名和年齡。
- 這樣,隨著我們的擴展,我們沒有改變原先UserInfo這個類和使用這個類的接口,我們通過適配的方法,將UserInfo類擴展出來
- 代碼:UserInfo類,實現getUserName方法
- <?php
- //早期的一個用戶類,只實現獲取用戶名的方法
- class UserInfo {
-
- public function getUserName() {
- return 'initphp';
- }
- }
- 代碼:MyOldObject類,從UserInfo類中獲取信息,輸出用戶名
- <?php
- include_once("UserInfo.php");
- class MyOldObject {
- public function write() {
- $UserInfo = new UserInfo;
- echo $UserInfo->getUserName();
- }
- }
- $a = new MyOldObject;
- $a->write();
- 代碼:UserInfoAdapter類,隨著時間推移,項目需求在變化,UserInfo類無法滿足需求,我們做了UserInfo類的適配器,滿足新功能的需求
- <?php
- include_once("UserInfo.php");
- class UserInfoAdapter extends UserInfo{
-
- public function getUserAge() {
- return 28;
- }
-
- public function getUser() {
- return array(
- 'username' => $this->getUserName(),
- 'age' => $this->getUserAge()
- );
- }
- }
- 代碼:MyNewObject類,新功能的類,需要打印出用戶年齡和姓名,UserInfo類無法滿足需求,需要調用UserInfoAdapter適配器這個類
- <?php
- include_once("UserInfoAdapter.php");
- class MyNewObject {
- public function write() {
- $UserInfoAdapter = new UserInfoAdapter;
- print_r($UserInfoAdapter->getUser());
- }
- }
- $a = new MyNewObject;
- $a->write();
參考:《PHP設計模式》Aaron Saray著