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

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

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

    ivaneeo's blog

    自由的力量,自由的生活。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
    范例(Examples)
    下面是一段簡單程序,其中有兩個classes:表示[定單]的Order和表示[客戶]的CustomerOrder引用了CustomerCustomer則并沒有引用Order
    class Order...
        Customer getCustomer() {
           return _customer;
        }
        void setCustomer(Customer arg) {
           _Customer = arg;
        }
        Customer _customer;   //這是一個“Order”to “Customer”的連接

    首先,我要為Customer添加一個值域。由于一個客戶可以擁有多份定單,所以這個新增值域應該是個群集(collection)。我不希望同一份定單在同一個群集中出現一次以上,所以這里適合使用set:
    class Customer {
        private Set _orders = new HashSet();
    現在,我需要決定由哪一個class負責控制關聯性(association)。我比較喜歡讓單一class來操控,因為這樣我就可以將所有[關聯處理邏輯]集中安置于一地。我將按照下列步驟做出這一決定:
    1. 如果兩者都是reference objects,而其間的關聯是[一對多]關系,那么就由[擁有單一reference]的那一方承擔[控制者]角色。以本例而言,如果一個客戶可擁有多份定單,那么就由Order class(定單)來控制關聯性。
    2. 如果某個對象是另一個對象的組成(component),那么由后者負責控制關聯性。
    3. 如果兩者都是reference objects,而其間的關聯是[多對多]關系,那么隨便其中哪個對象來控制關聯性,都無所謂。
    本例之中由于Order負責控制關聯性,所以我必須為Customer添加一個賦值函數,讓Order可以直接訪問_orders(訂單)集群。Order的修改函數(modifier)將使用這個輔助函數對指針兩端對象進行同步控制。我將這個賦值函數命名為friendOrders(),表示這個函數只能在這種特殊情況下使用。此外,如果OrderCustomer位在同一個package內,我還會將friendOrders()聲明為[package  可見度],使其可見程度降至最低。

    但如果這兩個classes不在同一個package內,我就只好把friendOrders()聲明為public了。
    class Customer...
        Set friendOrders() {
           return _orders;
        }
    現在。我要改變修改函數(modifier),令它同時更新反向指針:

    class Order...
        void setCustomer(Custoemr arg) ...
           if(_customer != null) _customer.friendOrders().remove(this);
           _customer = arg;
           if(_customer != null) _customer.friendOrders().add(this);
        }

    classes之間的關聯性是各式各樣的,因此修改函數(modifier)的代碼也會隨之有所差異。如果_customer的值不可能是null,我可 以拿掉上述的第一個null檢查,但仍然需要檢查引數(argument)是否是null。不過,基本形式總是相同的:先讓對方刪除[指向你]的指針,再 將你的指針指向一個新對象,最后讓那個新對象把它的指針指向你。

    如果你希望在Customer中也能修改連接(link),就讓它調用控制函數:

    class Customer ...
        void addOrder(Order arg) {
           arg.setCustomer(this);
        }
    如果一份訂單也可以對應多個客戶,那么你所面臨的就是一個[多對多]情況,重構后的函數可能是下面這樣:
    class Order ...   //controlling methods
        void addCustomer(Customer arg) {
           arg.friendOrders().add(this);
           _customers.add(arg);
        }
        void removeCustomer(Customer arg) {
           arg.friendOrders().remove(this);
           _customers.remove(arg);
        }
    class Customer ...
        void addOrder(Order arg) {
           arg.addCustomer(this);
        }
        void removeOrder(Order arg) {
           arg.removeCustomer(this);
        }
    posted on 2005-09-13 15:55 ivaneeo 閱讀(321) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
    主站蜘蛛池模板: 国产午夜精品久久久久免费视| 免费无码一区二区| a级毛片视频免费观看| 久久精品亚洲福利| 国产激情久久久久影院老熟女免费| 亚洲成a人片在线观看老师| 立即播放免费毛片一级| 久久久久亚洲AV成人网人人软件| 一个人看的hd免费视频| 亚洲综合在线另类色区奇米| 大地资源网高清在线观看免费 | 亚洲国产精品自在拍在线播放| 色婷婷亚洲一区二区三区| 全亚洲最新黄色特级网站 | 亚洲人成电影亚洲人成9999网| 免费人成视频在线观看网站| 亚洲欧洲另类春色校园小说| 四虎成人免费大片在线| 欧洲美女大片免费播放器视频| 亚洲精品成人片在线播放| 无码精品国产一区二区三区免费 | 亚洲短视频男人的影院| 免费观看美女用震蛋喷水的视频 | 亚洲精品9999久久久久无码| 四虎影视永久免费观看| 大地影院MV在线观看视频免费 | 亚洲久本草在线中文字幕| 青青久在线视频免费观看| 国产精品亚洲专一区二区三区| 久久亚洲国产成人影院网站| 久久免费视频99| 亚洲日韩中文字幕一区| 精品国产香蕉伊思人在线在线亚洲一区二区| 花蝴蝶免费视频在线观看高清版| 亚洲日本乱码一区二区在线二产线| 国产在线19禁免费观看国产| 免费人成在线观看视频高潮| 亚洲精品无播放器在线播放 | 亚洲国产精品自在线一区二区| 成人毛片手机版免费看| 国产精品黄页免费高清在线观看 |