第一章.良好應用程序基石(4)
上次,我們從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 1112 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)