1 目录及资源索引
Java4Android自学过程目录及资源索引
2 主要内容
老师这节课讲的主要内容如下:
- 被客户不断变化的需求“折磨”;
- 我们可以使用面向对象的方法,来做一些兼容。
主要就是教我们在应对一些变化很快的客户需求时,怎样使我们的代码更具有兼容、扩展性。
3 开始上课啦
3.1 客户第一次需求
先模拟一个场景,如下图所示:
看图所示内容,感觉这个需求很简单,大概只需要一个打印机的类,然后里边包含开机,关机以及打印功能即可。
定义一个打印机的类如下:
class Printer
{
void open()
{
System.out.println("Open");
}
void close()
{
System.out.println("Close");
}
void print(String s)
{
System.out.println("print-->" + s);
}
}
定义一个包含主函数的类,代码如下:
class Test
{
public static void main(String args[])
{
Printer printer = new Printer();
printer.open();
printer.print("zhangsan");
printer.close();
}
}
很简单吧,这一个类中,既实现了开机,关机,又实现了打印功能。但是,请往下看,此时客户又有了新需求。
3.2 客户第二次需求
此时客户又新加了一个不同品牌的打印机,需要我们修改程序,怎么办,还能怎么办,当然是听客户的啊。
老师教了两句名言:
- 客户永远都是对的;
- 如果客户错了怎么办,请参考第一条。
那没办法,只有重新修改代码,针对每种类型的打印机,分别建一个类,HP打印机相关代码如下:
class HPPrinter
{
void open()
{
System.out.println("Open");
}
void close()
{
System.out.println("Close");
}
void print(String s)
{
System.out.println("print-->" + s);
}
}
同样的,Canon打印机代码如下:
class CanonPrinter
{
void open()
{
System.out.println("Open");
}
void close()
{
this.clean();
System.out.println("Close");
}
void print(String s)
{
System.out.println("print-->" + s);
}
void clean()
{
System.out.println("clean");
}
}
同样的,需要一个主函数来调用这两个类,代码如下:
class Test
{
public static void main(String args[])
{
int flag = 1;
if(0 == flag) // 使用 HP 打印机
{
HPPrinter hpPrinter= new HPPrinter();
hpPrinter.open();
hpPrinter.print("zhangsan");
hpPrinter.close();
}
else if(1 == flag) // 使用 canon 打印机
{
CanonPrinter canonPrinter = new CanonPrinter();
canonPrinter.open();
canonPrinter.print("lisi");
canonPrinter.close();
}
}
}
有上面的代码,是否可以看到,有大量的重复代码,面向对象语言的终极目标就是消除重复代码,可是这个地方有这么多重复代码,这怎么能行呢?
那要怎么办呢?把这些类中共有的函数,抽象出一个父类来。
分析一下,这些打印机中,共有的有哪些函数?
- 开机函数;
- 关机函数
- 打印函数;
上边这些函数,不管是哪台打印机,都会有这些功能,因为这些是基础的,那我们就可以把这些函数,抽象出来,单独生成一个父类,具体代码如下:
class Printer
{
void open()
{
System.out.println("Open");
}
void close()
{
System.out.println("Close");
}
void print(String s)
{
System.out.println("print-->" + s);
}
}
接下来,HP打印机中的代码就可以简化,如下:
class HPPrinter extends Printer
{
}
由于惠普打印机,没有其他特殊的功能,所以直接继承父类就可以使用了;
下边是Canon打印机的代码,如下所示:
class CanonPrinter extends Printer
{
void close()
{
this.clean(); // 先调用本类的clean方法
super.close(); // 在调用父类的close方法
}
void clean()
{
System.out.println("clean");
}
}
在Canon打印机中,有自己的特殊功能 clean,则只需要把自己特殊的功能进行“复写”,即可,其他重复的代码,还是可以直接从父类中调用。
这样是不是看起来简洁很多了?程序编译后的运行结果也是一样的,如下:
可见代码运行结果并没有受到影响。
3.3 客户第三次需求
此时客户,如果又要修改需求怎么办?假如又要新增一台其他型号的打印机,我们要怎么办?如果用之前的方法,肯定就是为这个类型的打印机在单独建一个类,但是这样无疑又会有很多重复代码;
如果采用后来修改后的代码,直接新建一个子类,继承父类的内容,这样一些基本功能就不用重复写了,代码也很简介,看起来也好看多了,也不容易乱。
老师:“主要是心里要增加一根弦,看到重复代码就觉得浑身不舒服。”
4 总结
- 面向对象语言的终极目标:消除重复代码;
- 从思想上有了一定的转换,要是按照原来c语言的思想,肯定就是每一个都单独建立一个函数,然后来写;现在这个思想,就是公共的抽出来放到一块,大家用的时候,都去找他就好了;
- 本节感觉主要讲的是一个思路的问题,后续需要更多的代码练习。