1. 程式人生 > >第一章.良好應用程序基石(4)

第一章.良好應用程序基石(4)

簡單的 next() inventory class 變量 add tgui link asn

上次,我們從Guitar類中分離出了GuitarSpec類,可以讓用戶通過GuitarSpec類來搜索心儀的吉他。

這次用戶說了,賣吉他的時候,又多出了一個搜索方法,弦的個數,可以從1到12,我不管反正我就要這個搜索功能,你看著辦吧!

上次的GuitarSpec類中,我們並沒有提供用戶弦的個數這個搜索功能,於是乎,我們在GuitarSpec類中加上一個變量numStrings來存儲弦的個數:

GuitarSpec.java更新:

技術分享

這不算完,有沒有想到在Inventory.java的search()方法中我們沒有比對numStrings這個屬性,所以我們也要去比對。

等等,對象與對象之間說好的老死不相往來呢?低耦合:代碼中,各個對象各有特定的工作要做,而且只做那項工作,因此,代碼的功能被分散給許多定義良好的對象,它們各自將單一工作做的很好。

低耦合好處,一個對象的更新,不影響其他對象。比如你長高了,全世界的人都跟著一起長高了,想想都感到興奮!

所以,我們要做的是,更新GuitarSpec類中變量,對Inventory類沒有任何影響。

不行,怎麽會沒有影響呢?對比方法就在search()中。

有沒有想過將對比的方法從search()分離出來?

請問分離出來放哪裏好呢?

既然我們更新GuitarSpec類中變量,對比的方法也跟著增加,就放在GuitarSpec類中吧。

下面我們要講的是:委托(delegation):

Inventory的對象在search()中為了找到匹配吉他,就要去Guitar庫中和用戶的搜索信息進行對比。

現在,我們把對比方法給了GuitarSpec,那只有讓Inventory對象去求GuitarSpec的對象,讓它去完成自己完不成的任務。

好,這就是委托,自己完不成的任務,交給其他 能完成這個任務的人 來完成這個任務! 好繞口。

來個簡單的,我們要學會托人去辦事。

現在我們再來更新GuitarSpec類,讓它實現對比功能:

 1 package com.headfirst.guitar;
 2 
 3 public class GuitarSpec {
 4     Builder builder;
 5     String model;
 6     Type type;
 7     Wood backWood;
 8     Wood topWood;
 9     int numStrings;
10     
11
12 public GuitarSpec(Builder builder, String model, Type type, Wood backWood, Wood topWood){ 13 this.builder = builder; 14 this.model = model; 15 this.type = type; 16 this.backWood = backWood; 17 this.topWood = topWood; 18 this.numStrings = numStrings; 19 } 20 21 public Builder getBuilder(){ 22 return this.builder; 23 } 24 25 public String getModel(){ 26 return this.model; 27 } 28 29 public Type getType(){ 30 return this.type; 31 } 32 33 public Wood getBackWood(){ 34 return this.backWood; 35 } 36 37 public Wood getTopWood(){ 38 return this.topWood; 39 } 40 41 public int getNumStrings(){ 42 return this.numStrings; 43 } 44 45 public boolean matches(GuitarSpec otherSpec){ 46 if(builder != otherSpec.builder) 47 return false; 48 if((model != null) && (!model.equals("")) && 49 (!model.equalsIgnoreCase(otherSpec.model))) 50 return false; 51 if(type != otherSpec.type) 52 return false; 53 if(numStrings != otherSpec.numStrings) 54 return false; 55 if(backWood != otherSpec.backWood) 56 return false; 57 if(topWood != otherSpec.topWood) 58 return false; 59 60 return true; 61 } 62 }

Inventory.java中search()方法更新:

 1 public List search(GuitarSpec searchGuitar){
 2         List matchingGuitars = new LinkedList();
 3         for(Iterator i = guitars.iterator(); i.hasNext();){
 4             Guitar guitar = (Guitar) i.next();
 5             if(guitar.getGuitarSpec().matches(searchGuitar))
 6                 matchingGuitars.add(guitar);
 7         }
 8         
 9         return matchingGuitars;
10     }

從此以後,增加新的搜索變量,只要修改GuitarSpec類就可以了。

其實委托最好的解釋就是,equals()這個方法:

不是在方法之中比較兩個對象是否相等,而是調用兩個對象之一的equals()方法並傳入第二個對象,接著從equals()方法得到true或false的響應。

第一章.良好應用程序基石(4)