<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zxbyhcsdn

     

    關于接口隔離原則的一個實現:

    關于接口隔離原則的一個實現:
    使用場合,提供調用者需要的方法,屏蔽不需要的方法.滿足接口隔離原則.

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

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

    UML結構如下:

     

    下面是實現的代碼.

    //--這兒不用接口繼承,因為可能出現修改了父接口影響了子接口
    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();
        }

        //--下面是接口方法的實現.只是返回了一個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門戶調用方法:"+orderForPortal.getOrder());
            System.out.println("OtherSys外部系統調用方法:"+orderForOtherSys.insertOrder());
            System.out.println("Admin管理后臺調用方法:"+orderForAdmin.getOrder()+";"+orderForAdmin.insertOrder()+";"+orderForAdmin.updateOrder()+";"+orderForAdmin.deleteOrder());
        }
    }


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

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

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

    評論

    # re: 關于接口隔離原則的一個實現: 2008-07-25 23:49 hoho強

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

    # re: 關于接口隔離原則的一個實現: 2008-07-26 14:29 zhuxing

    寫的還是不錯的

    ISP作為OO中5個最主要的設計原則之一,在實際運用的時候往往會在實現細節上面出問題,關鍵是如何管理窄接口對應實例的問題,核心是創建實例化任務的封裝。

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

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

    # re: 關于接口隔離原則的一個實現: 2008-07-26 16:31 fish4j

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

    # re: 關于接口隔離原則的一個實現: 2008-07-26 19:23 zxbyh

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

    # re: 關于接口隔離原則的一個實現: 2008-10-26 22:20 C#

    學習學習  回復  更多評論   

    # re: 關于接口隔離原則的一個實現: 2009-01-09 08:26 seman

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

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

    # re: 關于接口隔離原則的一個實現: 2009-03-06 09:16 sys

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

    # re: 關于接口隔離原則的一個實現: 2009-11-26 21:17 zxbyh

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

    比如說,你的主板上的內存插槽是DDR2的,你就只能上DDR2的內存,
    如果要變成DDR3的接口,那只有考慮更換主板.
    其實當發生這樣的情況的時候,就是應當考慮"重構"了.
      回復  更多評論   

    導航

    統計

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 456亚洲人成在线播放网站| 亚洲va久久久噜噜噜久久男同| 亚洲系列国产精品制服丝袜第| 精品亚洲永久免费精品| 国产精品国产亚洲精品看不卡| 在线免费播放一级毛片| 亚洲精品成人无限看| 99精品在线免费观看| 亚洲熟妇无码爱v在线观看| 久久久久久久免费视频| 亚洲欧美综合精品成人导航| 性感美女视频免费网站午夜| 无码天堂va亚洲va在线va| 浮力影院亚洲国产第一页| 野花香在线视频免费观看大全 | 污污视频免费观看网站| 亚洲欧洲久久av| 久久99热精品免费观看动漫| 亚洲无人区视频大全| 韩国欧洲一级毛片免费| 日本高清不卡中文字幕免费| 亚洲一区二区女搞男| 蜜桃成人无码区免费视频网站 | 久久国产乱子伦精品免费不卡| 亚洲av无码一区二区乱子伦as | 久久久久一级精品亚洲国产成人综合AV区| 国产日韩精品无码区免费专区国产| 国产精品亚洲аv无码播放| 国产成人精品免费视频大全麻豆 | 亚洲午夜精品久久久久久app| 成人永久福利免费观看| 中文字幕在线成人免费看| 亚洲高清资源在线观看| 日韩免费观看一级毛片看看| 无码日韩人妻AV一区免费l| 人人狠狠综合久久亚洲婷婷 | 日本特黄特色免费大片| av片在线观看永久免费| 亚洲黄色免费网站| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲高清专区日韩精品|