第一章.良好应用程序基石(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
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的响应。

时间: 2024-10-08 02:00:18

第一章.良好应用程序基石(4)的相关文章

第一章.良好应用程序基石(2)

伟大软件的简易三步骤: 1.确认你的软件客户要它做的事. 2.运用基本的OO原则来增加软件的灵活性. 3.努力实现可维护.可重用的设计. 项目架构: Guitar类: 1 package com.headfirst.guitar; 2 3 public class Guitar { 4 private String serialNumber, builder, model, type, backWood, topWood; 5 private double price; 6 7 public G

第一章.良好应用程序基石(3)

客户又通知我们,他的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

第一章.良好应用程序基石(总结)

不会总结的程序员,不是好的程序员! 回头看,我们做了什么? 1.确认你的软件在做客户要它做的事 是的,我们做了让用户提供吉他属性,可以从Guitar库中搜索到心仪的吉他,之间出现了总是没有匹配到用户想要的吉他,导致吉他店差点倒闭.还好经过努力,我们把自己犯得错误纠正了!不然店长就和我们同归于尽了!太可怕了. 改正了大小写不匹配的错误,具体一点就是,把所有可以限制的吉他属性,通过枚举一一列出,想使用哪个,就调用哪个.不能限制的吉他属性,只好全部转为小写来匹配. 2.运用基本的OO原则来增加软件的灵

第一章.良好应用程序基石(1)

UML(Unified Modeling Language):统一建模语言 封装:将编程元素(programming elements)包含在较大.较抽象的实体内的过程,也被称为信息隐藏(information hiding)或关注点分离(separation of concerns) 继承:一个类继承来自另一个类的行为,如果需要,也可以改变该行为. 多态:与继承紧密相关.当一个类继承另一个类时,多态让子类能替代父类. 1 public Guitar getGuitar(String seria

大道至简第一章读后感 Java伪代码形式

观看了大道至简的第一章之后,从愚公移山的故事中我们可以抽象出一个项目, 下面用Java 伪代码的形式来进行编写: import java(愚公移山的故事) //愚公移山 public class yugong { //项目的目的:惩山北之塞,出入之迂: //项目的基本沟通方式:聚室而谋曰: //愚公确定的项目的目标:毕力平险,指通豫南,达于汉阴: //项目的技术方案:扣石垦壤,箕畚运于渤海之尾: //项目中的三名技术人员以及工程管理人员:(愚公)率子孙荷担者三夫: //力量较弱,富有激情的外援:

大道至简第一章读后感(java伪代码)

大道至简第一章用Java伪代码编写第一次写,难免有错误,欢迎指正和指导 //1 愚公移山public class yishan{public static void main(String[]args){while(山还在){扣石垦壤,箕畚运于渤海之尾:if(愚公死&&子孙存在)愚公=愚公儿子: //有子复焉,子又生孙,孙又生子else if(愚公死&&无子孙)//考虑没有子孙的情况break: }if(山平)System.out.println("山已平,指通豫

MVC 5 起航 - 第一章

本章将讲述一些构建ASP.NET  MVC 5 web application的一些基础知识, 通过本章学习,你应该能够掌握到构建MVC 5应用程序的基本步骤,并且通过展示一个完整的MVC 5 hello world应用程序了解MVC 5应用程序所带来的用户体验. 1. MVC 5 应用程序环境配置(参考本人机器配置) Win7 x64 Enterprise Visual Studio Express 2013 for Web or Visual Studio 2013 2. 创建一个简单的MV

《大道至简》第一章读后感及伪代码

在第一章中,作者通过<愚公移山>的寓言,引出了编程的根本:顺序.选择.循环."愚公移山"的工程虽然庞大,但是可以通过极其简单的方式来完成.并且在关于"会或者不会写程序的问题"时,作者给出了自己的看法:除了先天智障或后期懒惰者,都是会写程序的.后面用伪代码来呈现作者在第一章中提到的几个问题 import.java.大道至简.*; import.java.第一章.*; public class yishan{ public static void main(

日暮&middot;第一章&middot;决斗

日暮 第一章 决斗   泉州府,位于帝国的东南沿海,在数百年前,这里已是帝国最大的通商口岸之一,其一城之繁荣喧哗足以与异邦小国的都城相媲美,无数的人曾经来到这里,追逐财富,梦想,女人以及所有他们认为可以用自己一生去交换的东西,但如今,来自西夷的舰队横列在离泉州不足三十里的近海,一如傲慢的帝王,尽情地炫耀着武力:自东瀛跨海而来的僧侣,浪人肆无忌惮地横行在街巷之中,尽做着令人愤怒的肮脏勾当:还有来自西域的舞女,天竺的修业僧,波斯的商人--每个人的脸上都带着轻蔑讥讽的笑意,曾经的帝国,对于他们是如此的