客户又通知我们,他的Guitars库中有很多相同属性的吉他,但是可能售价上不同。
现在,我们要实现的是,怎样返回库中能匹配所有属性的Guitar,并列出来。
更新Inventory.java中的search()方法:
1 public List search(Guitar searchGuitar){ 2 List matchingGuitars = new LinkedList(); 3 for(Iterator i = guitars.iterator(); i.hasNext();){ 4 Guitar guitar = (Guitar) i.next(); 5 6 if(searchGuitar.getBuilder() != guitar.getBuilder()) 7 continue; 8 9 String model = searchGuitar.getModel().toLowerCase(); 10 if((model != null) && (!model.equals("")) && 11 (!model.equals(guitar.getModel().toLowerCase()))) 12 continue; 13 14 if(searchGuitar.getType() != guitar.getType()) 15 continue; 16 17 if(searchGuitar.getBackWood() != guitar.getBackWood()) 18 continue; 19 20 if(searchGuitar.getTopWood() != guitar.getTopWood()) 21 continue; 22 23 matchingGuitars.add(guitar); 24 } 25 26 return matchingGuitars; 27 }
更新FindGuitarTester.java:
1 package com.headfirst.guitar; 2 3 import java.util.Iterator; 4 import java.util.List; 5 6 public class FindGuitarTester { 7 public static void main(String[] args){ 8 Inventory inventory = new Inventory(); 9 initializeInventory(inventory); 10 11 Guitar whatErinLikes = new Guitar("", 0, Builder.FENDER, "Stratocastor", 12 Type.ELECTRIC, Wood.ALDER, Wood.ALDER); 13 14 List matchingGuitars = inventory.search(whatErinLikes); 15 if(!matchingGuitars.isEmpty()){ 16 System.out.println("Erin, you might like these guitars: "); 17 for(Iterator i = matchingGuitars.iterator(); i.hasNext();){ 18 Guitar guitar = (Guitar) i.next(); 19 System.out.println("We have a " + 20 guitar.getBuilder() + " " + guitar.getModel() + " " + 21 guitar.getType() + " guitar: " + 22 guitar.getBackWood() + " back and sides, " + 23 guitar.getTopWood() + " top. You can have it for only $" + 24 guitar.getPrice() + "!"); 25 } 26 }else{ 27 System.out.println("Sorry, Erin, we have nothing for you."); 28 } 29 } 30 31 private static void initializeInventory(Inventory inventory){ 32 inventory.addGuitar("V95693", 1499.95, Builder.FENDER, "Stratocastor", Type.ELECTRIC, Wood.ALDER, Wood.ALDER); 33 inventory.addGuitar("B1234", 1600.35, Builder.FENDER, "Stratocastor", Type.ELECTRIC, Wood.ALDER, Wood.ALDER); 34 } 35 }
通过以上的修改,我们完成了步骤一:确认你的软件做客户要它做的事。
我们开始步骤二:运用基本的OO原则来增加软件的灵活性。
1.对象应该做其名称所指之事。
2.每个对象应该代表单一概念。
3.未使用的特性是无用的赠品。
4.任何时候,看到重复的代码,就找个地方进行封装。
Inventory.java中的search()方法,需要改进的地方就是,用户不必传入一个Guitar对象,因为Guitar里的变量不全是用来搜索的,比如价格、序号用户是不知道的。
所以,我们要从Guitar类中分割出来一个类,专门用来存储用户搜索数据。
项目架构:
Guitar.java:
1 package com.headfirst.guitar; 2 3 public class Guitar { 4 private String serialNumber; 5 private double price; 6 private GuitarSpec guitarSpec; 7 8 public Guitar(String serialNumber, double price, GuitarSpec guitarSpec){ 9 this.serialNumber = serialNumber; 10 this.price = price; 11 this.guitarSpec = guitarSpec; 12 } 13 14 public String getSerialNumber(){ 15 return serialNumber; 16 } 17 public double getPrice(){ 18 return price; 19 } 20 public void setPrice(float newPrice){ 21 this.price = newPrice; 22 } 23 public GuitarSpec getGuitarSpec(){ 24 return guitarSpec; 25 } 26 }
GuitarSpec.java:
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 10 public GuitarSpec(Builder builder, String model, Type type, Wood backWood, Wood topWood){ 11 this.builder = builder; 12 this.model = model; 13 this.type = type; 14 this.backWood = backWood; 15 this.topWood = topWood; 16 } 17 18 public Builder getBuilder(){ 19 return this.builder; 20 } 21 22 public String getModel(){ 23 return this.model; 24 } 25 26 public Type getType(){ 27 return this.type; 28 } 29 30 public Wood getBackWood(){ 31 return this.backWood; 32 } 33 34 public Wood getTopWood(){ 35 return this.topWood; 36 } 37 }
Inventory.java 修改:
1 package com.headfirst.guitar; 2 3 import java.util.Iterator; 4 import java.util.LinkedList; 5 import java.util.List; 6 7 public class Inventory { 8 9 private List guitars; 10 11 public Inventory(){ 12 guitars = new LinkedList(); 13 } 14 15 public void addGuitar(String serialNumber, double price, GuitarSpec guitarSpec){ 16 Guitar guitar = new Guitar(serialNumber, price, guitarSpec); 17 guitars.add(guitar); 18 } 19 20 public Guitar getGuitar(String serialNumber){ 21 for(Iterator i = guitars.iterator(); i.hasNext();){ 22 Guitar guitar = (Guitar) i.next(); 23 if(guitar.getSerialNumber().equals(serialNumber)){ 24 return guitar; 25 } 26 } 27 28 return null; 29 } 30 31 public List search(GuitarSpec searchGuitar){ 32 List matchingGuitars = new LinkedList(); 33 for(Iterator i = guitars.iterator(); i.hasNext();){ 34 Guitar guitar = (Guitar) i.next(); 35 GuitarSpec guitarSpec = guitar.getGuitarSpec(); 36 37 if(searchGuitar.getBuilder() != guitarSpec.getBuilder()) 38 continue; 39 40 String model = searchGuitar.getModel().toLowerCase(); 41 if((model != null) && (!model.equals("")) && 42 (!model.equals(guitarSpec.getModel().toLowerCase()))) 43 continue; 44 45 if(searchGuitar.getType() != guitarSpec.getType()) 46 continue; 47 48 if(searchGuitar.getBackWood() != guitarSpec.getBackWood()) 49 continue; 50 51 if(searchGuitar.getTopWood() != guitarSpec.getTopWood()) 52 continue; 53 54 matchingGuitars.add(guitar); 55 } 56 57 return matchingGuitars; 58 } 59 }
FindGuitarTester.java修改:
1 package com.headfirst.guitar; 2 3 import java.util.Iterator; 4 import java.util.List; 5 6 public class FindGuitarTester { 7 public static void main(String[] args){ 8 Inventory inventory = new Inventory(); 9 initializeInventory(inventory); 10 11 GuitarSpec whatErinLikes = new GuitarSpec(Builder.FENDER, "Stratocastor", Type.ELECTRIC, Wood.ALDER, Wood.ALDER); 12 13 List matchingGuitars = inventory.search(whatErinLikes); 14 if(!matchingGuitars.isEmpty()){ 15 System.out.println("Erin, you might like these guitars: "); 16 for(Iterator i = matchingGuitars.iterator(); i.hasNext();){ 17 Guitar guitar = (Guitar) i.next(); 18 GuitarSpec guitarSpec = guitar.getGuitarSpec(); 19 System.out.println("We have a " + 20 guitarSpec.getBuilder() + " " + guitarSpec.getModel() + " " + 21 guitarSpec.getType() + " guitar: " + 22 guitarSpec.getBackWood() + " back and sides, " + 23 guitarSpec.getTopWood() + " top. You can have it for only $" + 24 guitar.getPrice() + "!"); 25 } 26 }else{ 27 System.out.println("Sorry, Erin, we have nothing for you."); 28 } 29 } 30 31 private static void initializeInventory(Inventory inventory){ 32 GuitarSpec guitarSpec1 = new GuitarSpec(Builder.FENDER, "Stratocastor", Type.ELECTRIC, Wood.ALDER, Wood.ALDER); 33 inventory.addGuitar("V95693", 1499.95, guitarSpec1); 34 inventory.addGuitar("B1234", 1600.35, guitarSpec1); 35 } 36 }
我们把Guitar类中给用户搜索用的变量,重新构造一个新的类GuitarSpec。
这样Guitar类的功能就很单一了,就是存储Guitar对象,GuitarSpec类则是为了提供给用户搜索相关信息的。
运行结果: