• PHP设计模式系列


    • 什么是适配器:

    适配器设计模式只是将某个对象的接口适配为另一个对象所期望的接口。

     

    • 设计情景:
    1. 假如我们原始的有一个UserInfo的类,提供用户信息的类,早起设计该类的时候,只实现了一个getUserName获取用户名的方法。
    2. 我们的MyOldObject类中,将从UserInfo这个类中获取用户信息,并且输出用户名
    3. 随着时间的推移,我们旧的UserInfo这个类只提供的获取用户名的方法,已经没法满足需求,我们同时需要获取用户的年龄等信息。
    4. 为了不改变原本UserInfo这个类,我们就继承UserInfo,建立一个UserInfoAdapter类,实现getAge获取年龄这样的方法。
    5. 在我们的MyNewObject新的类中,我们实例化UserInfoAdapter,打印出用户姓名和年龄。
    6. 这样,随着我们的扩展,我们没有改变原先UserInfo这个类和使用这个类的接口,我们通过适配的方法,将UserInfo类扩展出来
    • 代码:UserInfo类,实现getUserName方法
    1. <?php   
    2. //早期的一个用户类,只实现获取用户名的方法  
    3. class UserInfo {  
    4.   
    5.     public function getUserName() {  
    6.         return 'initphp';  
    7.     }  
    8. }  
    • 代码:MyOldObject类,从UserInfo类中获取信息,输出用户名
    1. <?php  
    2. include_once("UserInfo.php");  
    3. class MyOldObject {  
    4.     public function write() {  
    5.         $UserInfo = new UserInfo;  
    6.         echo $UserInfo->getUserName();  
    7.     }  
    8. }  
    9. $a = new MyOldObject;  
    10. $a->write();  
    • 代码:UserInfoAdapter类,随着时间推移,项目需求在变化,UserInfo类无法满足需求,我们做了UserInfo类的适配器,满足新功能的需求
    1. <?php   
    2. include_once("UserInfo.php");   
    3. class UserInfoAdapter extends UserInfo{  
    4.   
    5.     public function getUserAge() {  
    6.         return 28;  
    7.     }  
    8.       
    9.     public function getUser() {   
    10.         return array(  
    11.             'username' => $this->getUserName(),  
    12.             'age' => $this->getUserAge()  
    13.         );  
    14.     }  
    15. }  
    • 代码:MyNewObject类,新功能的类,需要打印出用户年龄和姓名,UserInfo类无法满足需求,需要调用UserInfoAdapter适配器这个类
    1. <?php  
    2. include_once("UserInfoAdapter.php");  
    3. class MyNewObject {   
    4.     public function write() {  
    5.         $UserInfoAdapter = new UserInfoAdapter;  
    6.         print_r($UserInfoAdapter->getUser());   
    7.     }  
    8. }  
    9. $a = new MyNewObject;  
    10. $a->write();  

     

     

    参考:《PHP设计模式》Aaron Saray著

  • 相关阅读:
    【算法】一致性Hash算法
    P1576 最小花费 题解
    Vijos1234 口袋的天空 题解
    P1379 八数码难题 题解
    Tarjan求无向图必经点 笔记
    P3372 【模板】线段树 1 题解
    CF1332A Exercising Walk 题解
    P6270 [SHOI2002]取石子游戏 题解
    P6269 [SHOI2002]空中都市 题解
    P6268 [SHOI2002]舞会 题解
  • 原文地址:https://www.cnblogs.com/wanghaitao/p/9440354.html
Copyright © 2020-2023  润新知