0
点赞
收藏
分享

微信扫一扫

Java4Android自学记录(16):面向对象的应用


1 目录及资源索引

  ​​Java4Android自学过程目录及资源索引​​

2 主要内容

  老师这节课讲的主要内容如下:


  1. 被客户不断变化的需求“折磨”;
  2. 我们可以使用面向对象的方法,来做一些兼容。

  主要就是教我们在应对一些变化很快的客户需求时,怎样使我们的代码更具有兼容、扩展性。

3 开始上课啦

3.1 客户第一次需求

  先模拟一个场景,如下图所示:

Java4Android自学记录(16):面向对象的应用_父类

  看图所示内容,感觉这个需求很简单,大概只需要一个打印机的类,然后里边包含开机,关机以及打印功能即可。

  定义一个打印机的类如下:

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 客户第二次需求

Java4Android自学记录(16):面向对象的应用_面向对象语言_02

  此时客户又新加了一个不同品牌的打印机,需要我们修改程序,怎么办,还能怎么办,当然是听客户的啊。

  老师教了两句名言:


  1. 客户永远都是对的;
  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();
}
}
}

  有上面的代码,是否可以看到,有大量的重复代码,面向对象语言的终极目标就是消除重复代码,可是这个地方有这么多重复代码,这怎么能行呢?

  那要怎么办呢?把这些类中共有的函数,抽象出一个父类来。

  分析一下,这些打印机中,共有的有哪些函数?


  1. 开机函数;
  2. 关机函数
  3. 打印函数;

  上边这些函数,不管是哪台打印机,都会有这些功能,因为这些是基础的,那我们就可以把这些函数,抽象出来,单独生成一个父类,具体代码如下:

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,则只需要把自己特殊的功能进行“复写”,即可,其他重复的代码,还是可以直接从父类中调用。

  这样是不是看起来简洁很多了?程序编译后的运行结果也是一样的,如下:

Java4Android自学记录(16):面向对象的应用_编程语言_03

  可见代码运行结果并没有受到影响。

3.3 客户第三次需求

  此时客户,如果又要修改需求怎么办?假如又要新增一台其他型号的打印机,我们要怎么办?如果用之前的方法,肯定就是为这个类型的打印机在单独建一个类,但是这样无疑又会有很多重复代码;

  如果采用后来修改后的代码,直接新建一个子类,继承父类的内容,这样一些基本功能就不用重复写了,代码也很简介,看起来也好看多了,也不容易乱。

  老师:“主要是心里要增加一根弦,看到重复代码就觉得浑身不舒服。”

4 总结


  1. 面向对象语言的终极目标:消除重复代码;
  2. 从思想上有了一定的转换,要是按照原来c语言的思想,肯定就是每一个都单独建立一个函数,然后来写;现在这个思想,就是公共的抽出来放到一块,大家用的时候,都去找他就好了;
  3. 本节感觉主要讲的是一个思路的问题,后续需要更多的代码练习。


举报

相关推荐

0 条评论