zxbyhcsdn

           

          關(guān)于接口隔離原則的一個實現(xiàn):

          關(guān)于接口隔離原則的一個實現(xiàn):
          使用場合,提供調(diào)用者需要的方法,屏蔽不需要的方法.滿足接口隔離原則.

          比如說電子商務(wù)的系統(tǒng),有訂單這個類,有三個地方會使用到,
          一個是門戶,只能有查詢方法,
          一個是外部系統(tǒng),有添加訂單的方法,
          一個是管理后臺,添加刪除修改查詢都要用到.

          根據(jù)接口隔離原則(ISP),一個類對另外一個類的以來性應(yīng)當(dāng)是建立在最小的接口上.
          也就是說,對于門戶,它只能依賴有一個查詢方法的接口.

          UML結(jié)構(gòu)如下:

           

          下面是實現(xiàn)的代碼.

          //--這兒不用接口繼承,因為可能出現(xiàn)修改了父接口影響了子接口
          interface IOrderForPortal{
              String getOrder();
          }

          interface IOrderForOtherSys{
              String insertOrder();
              String getOrder();
          }

          interface IOrderForAdmin{ //extends IOrderForPortal,IOrderForOtherSys
              String deleteOrder();
              String updateOrder();
              String insertOrder();
              String getOrder();
          }

          /*
          interface IOrderForPortal{
              String getOrder();
          }

          interface IOrderForOtherSys{
              String insertOrder();
          }

          interface IOrderForAdmin extends IOrderForPortal,IOrderForOtherSys{
              String updateOrder();
              String deleteOrder();
          }
          */

          class Order implements IOrderForPortal,IOrderForOtherSys,IOrderForAdmin{
              private Order(){
                  //--什么都不干,就是為了不讓直接 new,防止客戶端直接New,然后訪問它不需要的方法.
              }

              //返回給Portal
              public static IOrderForPortal getOrderForPortal(){
                  return (IOrderForPortal)new Order();
              }
              //返回給OtherSys
              public static IOrderForOtherSys getOrderForOtherSys(){
                  return (IOrderForOtherSys)new Order();
              }
              //返回給Admin
              public static IOrderForAdmin getOrderForAdmin(){
                  return (IOrderForAdmin)new Order();
              }

              //--下面是接口方法的實現(xiàn).只是返回了一個String用于演示---------------

              public String getOrder(){
                  return "implemented getOrder";
              }

              public String insertOrder(){
                  return "implemented insertOrder";
              }

              public String updateOrder(){
                  return "implemented updateOrder";
              }

              public String deleteOrder(){
                  return "implemented deleteOrder";
              }
          }

          public class TestCreateLimit{
              public static void main(String[] args){
                  IOrderForPortal orderForPortal = Order.getOrderForPortal();
                  IOrderForOtherSys orderForOtherSys = Order.getOrderForOtherSys();
                  IOrderForAdmin orderForAdmin = Order.getOrderForAdmin();

                  System.out.println("Portal門戶調(diào)用方法:"+orderForPortal.getOrder());
                  System.out.println("OtherSys外部系統(tǒng)調(diào)用方法:"+orderForOtherSys.insertOrder());
                  System.out.println("Admin管理后臺調(diào)用方法:"+orderForAdmin.getOrder()+";"+orderForAdmin.insertOrder()+";"+orderForAdmin.updateOrder()+";"+orderForAdmin.deleteOrder());
              }
          }


          這樣就能很好的滿足接口隔離原則了,調(diào)用者只能訪問它自己的方法,不能訪問到不應(yīng)該訪問的方法.

          歡迎討論...寫這些的目的就是為了共同進(jìn)步,有什么錯誤或者不足,歡迎指出....

          posted on 2008-07-25 18:03 zxbyh 閱讀(3127) 評論(8)  編輯  收藏 所屬分類: OOAD

          評論

          # re: 關(guān)于接口隔離原則的一個實現(xiàn): 2008-07-25 23:49 hoho強(qiáng)

          恩 不錯 之前沒看到過這樣的方法  回復(fù)  更多評論   

          # re: 關(guān)于接口隔離原則的一個實現(xiàn): 2008-07-26 14:29 zhuxing

          寫的還是不錯的

          ISP作為OO中5個最主要的設(shè)計原則之一,在實際運用的時候往往會在實現(xiàn)細(xì)節(jié)上面出問題,關(guān)鍵是如何管理窄接口對應(yīng)實例的問題,核心是創(chuàng)建實例化任務(wù)的封裝。

          以樓主的例子為例,樓主很好的利用的creation method(以靜態(tài)公共接口提供實例)的方式,很好的將目標(biāo)接口對應(yīng)實例創(chuàng)建和初始化進(jìn)行了封裝,并和窄接口的使用客戶端進(jìn)行了解藕。如果不是這樣,那么ISP的原則可能就在客戶端創(chuàng)建實例的過程中被扭曲了。

          更負(fù)責(zé)一些的情況,可以果斷的采用工廠的方式提供實例。寧可稍微過度設(shè)計,也要堅決避免藕合。  回復(fù)  更多評論   

          # re: 關(guān)于接口隔離原則的一個實現(xiàn): 2008-07-26 16:31 fish4j

          不錯的文章,言簡意賅 , 個人感覺配合工廠效果會更好 ^^  回復(fù)  更多評論   

          # re: 關(guān)于接口隔離原則的一個實現(xiàn): 2008-07-26 19:23 zxbyh

          對,這兒可以配合工廠.
          但是我講這個的重點是怎樣解決 隔離的問題,
          我擔(dān)心再拉進(jìn)工廠,會沖淡主題了!!  回復(fù)  更多評論   

          # re: 關(guān)于接口隔離原則的一個實現(xiàn): 2008-10-26 22:20 C#

          學(xué)習(xí)學(xué)習(xí)  回復(fù)  更多評論   

          # re: 關(guān)于接口隔離原則的一個實現(xiàn): 2009-01-09 08:26 seman

          //因為Order.getOrderForPortal()返回的實質(zhì)還是Order類,只是窄化了
          //如果client知道,并強(qiáng)制轉(zhuǎn)換成Order的話,則后果很難想象

          System.out.println("Portal門戶調(diào)用方法:" + ((Order)orderForPortal).insertOrder());
            回復(fù)  更多評論   

          # re: 關(guān)于接口隔離原則的一個實現(xiàn): 2009-03-06 09:16 sys

          如果這三個接口中任意一個有變化怎么辦??  回復(fù)  更多評論   

          # re: 關(guān)于接口隔離原則的一個實現(xiàn): 2009-11-26 21:17 zxbyh

          一般來說接口是抽象層次上的,屬于比較高層次的業(yè)務(wù)邏輯,在設(shè)計的時候盡量考慮不會發(fā)生變化.

          比如說,你的主板上的內(nèi)存插槽是DDR2的,你就只能上DDR2的內(nèi)存,
          如果要變成DDR3的接口,那只有考慮更換主板.
          其實當(dāng)發(fā)生這樣的情況的時候,就是應(yīng)當(dāng)考慮"重構(gòu)"了.
            回復(fù)  更多評論   

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西吉县| 海林市| 信阳市| 富裕县| 石城县| 平陆县| 呈贡县| 紫金县| 喀什市| 太仓市| 武义县| 西畴县| 宽甸| 房产| 江源县| 青浦区| 宿州市| 阜南县| 沁阳市| 乐业县| 昭平县| 南丰县| 台州市| 观塘区| 绵阳市| 天峨县| 滨海县| 同德县| 海南省| 巴彦淖尔市| 白银市| 建水县| 曲沃县| 连州市| 库尔勒市| 浦县| 耿马| 资溪县| 大埔县| 两当县| 赣榆县|