<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                19.4 適配器模式的擴展 我們剛剛講的人力資源管理的例子中,其實是一個比較幸運的例子,為什么呢?如果勞動服務公司提供的人員接口不止一個,也就是說,用戶基本信息是一個接口,工作信息是一個接口,家庭信息是一個接口,總共有三個接口三個實現類,想想看如何處理呢?不能再使用我們上面的方法了,為什么呢?Java是不支持多繼承的,你難道想讓OuterUserInfo繼承三個實現類?此路不通,再想一個辦法,對哦,可以使用類關聯的辦法嘛!聲明一個OuterUserInfo實現類,實現IUserInfo接口,通過再關聯其他三個實現類不就可以解決這個問題了嗎?是的,是的,好方法,我們先畫出類圖,如圖19-8所示。 OuterUserInfo通過關聯的方式與外界的三個實現類通訊,當然也可以理解為是聚合關系。IUserInfo和UserInfo代碼如代碼清單19-1和代碼清單19-2所示,不再贅述。我們來看看拆分后的三個接口和實現類,用戶基本信息接口如代碼清單19-13所示。 ![](https://box.kancloud.cn/2016-08-14_57b003667e70d.jpg) 圖19-8 拆分接口后的類圖 代碼清單19-13 用戶基本信息接口 public?interface?IOuterUserBaseInfo?{ ?????//基本信息,比如名稱、性別、手機號碼等 ?????public?Map?getUserBaseInfo(); } 用戶家庭信息接口如代碼清單19-14所示。 代碼清單19-14 用戶家庭信息接口 public?interface?IOuterUserHomeInfo?{ ?????//用戶的家庭信息 ?????public?Map?getUserHomeInfo(); } 用戶工作信息接口如代碼清單19-15所示。 代碼清單19-15 用戶工作信息接口 public?interface?IOuterUserOfficeInfo?{ ?????//工作區域信息 ?????public?Map?getUserOfficeInfo(); } 讀到這里,讀者應該想到這樣一個問題:系統這樣設計是否合理呢?合理,絕對合理!想想單一職責原則是怎么說的,類和接口要保持職責單一,在實際的應用中類可以有多重職責,但是接口一定要職責單一,因此,我們上面拆分接口的假想也是非常合乎邏輯的。我們來看三個相關的實現類,用戶基本信息如代碼清單19-16所示。 代碼清單19-16 用戶基本信息 public?class?OuterUserBaseInfo?implements?IOuterUserBaseInfo?{ ?????/*? ??????*?用戶的基本信息 ??????*/ ?????public?Map?getUserBaseInfo()?{ ?????????????HashMap?baseInfoMap?=?new?HashMap();??????? ?????????????baseInfoMap.put("userName",?"這個員工叫混世魔王..."); ?????????????baseInfoMap.put("mobileNumber",?"這個員工電話是..."); ?????????????return?baseInfoMap; ?????} } 用戶家庭信息如代碼清單19-17所示。 代碼清單19-17 用戶家庭信息 public?class?OuterUserHomeInfo?implements?IOuterUserHomeInfo?{ ?????/*? ??????*?員工的家庭信息 ??????*/ ?????public?Map?getUserHomeInfo()?{ ?????????????HashMap?homeInfo?=?new?HashMap(); ?????????????homeInfo.put("homeTelNumbner",?"員工的家庭電話是..."); ?????????????homeInfo.put("homeAddress",?"員工的家庭地址是..."); ?????????????return?homeInfo; ?????} } 用戶工作信息如代碼清單19-18所示。 代碼清單19-18 用戶工作信息 public?class?OuterUserOfficeInfo?implements?IOuterUserOfficeInfo?{ ?????/*? ??????*?員工的工作信息,比如,職位等 ??????*/ ?????public?Map?getUserOfficeInfo()?{ ?????????????HashMap?officeInfo?=?new?HashMap(); ?????????????officeInfo.put("jobPosition","這個人的職位是BOSS..."); ?????????????officeInfo.put("officeTelNumber",?"員工的辦公電話是..."); ?????????????return?officeInfo; ?????} } 這里又到我們的核心了——適配器。好,我們來看適配器代碼,如代碼清單19-19所示。 代碼清單19-19 適配器 public?class?OuterUserInfo?implements?IUserInfo?{ ?????//源目標對象 ?????private?IOuterUserBaseInfo?baseInfo?=?null;?????//員工的基本信息 ?????private?IOuterUserHomeInfo?homeInfo?=?null;?????//員工的家庭信息 ?????private?IOuterUserOfficeInfo?officeInfo?=?null;?//工作信息 ?????//數據處理 ?????private?Map?baseMap?=?null; ?????private?Map?homeMap?=?null; ?????private?Map?officeMap?=?null; ?????//構造函數傳遞對象 ?????public?OuterUserInfo(IOuterUserBaseInfo?_baseInfo,IOuterUserHomeInfo?_homeInfo,IOuterUserOfficeInfo?_officeInfo){ ?????????????this.baseInfo?=?_baseInfo; ?????????????this.homeInfo?=?_homeInfo; ?????????????this.officeInfo?=?_officeInfo; ?????????????//數據處理 ?????????????this.baseMap?=?this.baseInfo.getUserBaseInfo(); ?????????????this.homeMap?=?this.homeInfo.getUserHomeInfo(); ?????????????this.officeMap?=?this.officeInfo.getUserOfficeInfo(); ?????} ??????//家庭地址 ?????public?String?getHomeAddress()?{ ?????????????String?homeAddress?=?(String)this.homeMap.get("homeAddress"); ?????????????System.out.println(homeAddress); ?????????????return?homeAddress; ?????} ??????//家庭電話號碼 ?????public?String?getHomeTelNumber()?{ ?????????????String?homeTelNumber?=?(String)this.homeMap.get("homeTelNumber"); ?????????????System.out.println(homeTelNumber); ?????????????return?homeTelNumber; ?????} ?????//職位信息 ?????public?String?getJobPosition()?{ ?????????????String?jobPosition?=?(String)this.officeMap.get("jobPosition"); ?????????????System.out.println(jobPosition); ?????????????return?jobPosition; ?????} ??????//手機號碼 ?????public?String?getMobileNumber()?{ ?????????????String?mobileNumber?=?(String)this.baseMap.get("mobileNumber"); ?????????????System.out.println(mobileNumber); ?????????????return?mobileNumber; ?????} ??????//辦公電話 ?????public?String?getOfficeTelNumber()?{ ?????????????String?officeTelNumber=?(String)this.officeMap.get("officeTelNumber"); ?????????????System.out.println(officeTelNumber); ?????????????return?officeTelNumber; ?????} ?????//?員工的名稱 ?????public?String?getUserName()?{ ?????????????String?userName?=?(String)this.baseMap.get("userName"); ?????????????System.out.println(userName); ?????????????return?userName; ?????} } 大家只要注意一下黑色字體的構造函數就可以了,它接收三個對象,其他部分變化不大,只是變量名稱進行了修改,我們再來看場景類,如代碼清單19-20所示。 代碼清單19-20 場景類 public?class?Client?{ ?????public?static?void?main(String[]?args)?{ ?????????????//外系統的人員信息 ?????????????IOuterUserBaseInfo?baseInfo?=?new?OuterUserBaseInfo(); ?????????????IOuterUserHomeInfo?homeInfo?=?new?OuterUserHomeInfo(); ?????????????IOuterUserOfficeInfo?officeInfo?=?new?OuterUserOfficeInfo(); ?????????????//傳遞三個對象 ??????????????IUserInfo?youngGirl?=?new?OuterUserInfo(baseInfo,homeInfo,officeInfo); ?????????????//從數據庫中查到101個 ?????????????for(int?i=0;i<101;i++){ ?????????????????????youngGirl.getMobileNumber(); ?????????????}????? ?????} } 運行的結果還是相同的。大家想想看,OuterUserInfo變成了委托服務,把IUserInfo接口需要的所有的操作都委托給其他三個接口下的實現類,它的委托是通過對象層次的關聯關系進行委托的,而不是繼承關系。好了,講了這么多,我們需要給這種適配器起個名字,就是對象適配器,我們之前講的通過繼承進行的適配,叫做類適配器。對象適配器的通用類圖,如圖19-9所示。 ![](https://box.kancloud.cn/2016-08-14_57b003669f1e9.jpg) 圖19-9 對象適配器類圖 適配器的通用代碼也比較簡單,把原有的繼承關系變更為關聯關系就可以了,不再贅述。對象適配器和類適配器的區別是:類適配器是類間繼承,對象適配器是對象的合成關系,也可以說是類的關聯關系,這是兩者的根本區別。二者在實際項目中都會經常用到,由于對象適配器是通過類間的關聯關系進行耦合的,因此在設計時就可以做到比較靈活,比如修補源角色的隱形缺陷,關聯其他對象等,而類適配器就只能通過覆寫源角色的方法進行擴展,在實際項目中,對象適配器使用到場景相對較多。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看