接口有何用?面试宝典上背下来的总结,你真的明白吗? Java中也是类似的,定义了接口,就等于定义了调用对象的标准。
可以把接口理解成一个更加纯粹的抽象类,因此它也不能生成对象。这要怎么办呢?回想抽象类的处理方法,可以用一个类来继承(接口中叫实现)它,从而在子类中生成对象。 一个最简单的接口示例: 定义一个接口: interface USB { public void read(); public void write();} 定义它的子类,来实现这个接口: class Phone implements USB { public void read() { System.out.println('Phone --> Read'); } public void write() { System.out.println('Phone --> Write'); }} 测试: class Test { public static void main(String args []) { Phone phone = new Phone(); //向上转型 USB usb = phone; usb.read(); usb.write(); }} 运行结果:
interface WiFi { public void open(); public void close();} 让Phone也实现WiFi接口: class Phone implements USB, WiFi { public void read() { System.out.println('Phone --> Reading'); } public void write() { System.out.println('Phone --> Writing'); } //实现WiFi中的抽象方法 public void open() { System.out.println('WiFi --> Open'); } public void close() { System.out.println('WiFi --> Close'); } } 测试一下: class Test { public static void main(String args []) { Phone phone = new Phone(); //向上转型时,就有两种选择 USB usb = phone; usb.read(); usb.write(); WiFi wifi = phone; wifi.open(); wifi.close(); }} 运行结果:
interface SbFi extends USB, WiFi { public void piu();} 这样SbFi接口就拥有read(),write(),open(),close()和piu()五个抽象方法了:) 首先定义一个Printer接口,描述打印机都有的行为: interface Printer { void open(); void print(String s); void close();} 在惠普打印机类中,实现Printer中的抽象方法: class HPPrinter implements Printer { public void open() { System.out.println('HP: open'); } public void print(String s) { System.out.println('HP: print--> ' + s); } public void close() { System.out.println('HP: close'); }} 在佳能打印机中,又增加了新的方法,清洗: public class CanonPrinter implements Printer { public void open() { System.out.println('Canon: open'); } public void print(String s) { System.out.println('Canon: print-->' + s); } public void close() { this.clean(); System.out.println('Canon: close'); } public void clean() { System.out.println('Canon: clean'); }} 测试: class Test { public static void main(String args []) { Printer printer = null; //为简便,flag模拟用户选择使用哪台打印机 int flag = 1; if(flag == 0) { //向上转型 printer = new HPPrinter(); } else if(flag == 1) { printer = new CanonPrinter(); } printer.open(); printer.print('向上转型好用吧~'); printer.close(); }} 运行: 进击的工厂方法模式 我们可以设计一个类,在里面添加一个函数,它的功能就是根据用户的选择生成打印机对象,以后我们直接调用这个函数就行了。函数的参数,就是用户的选择,返回值,就是一个Printer类型的对象。 class PrinterFactory { //添加static是为了调用方便 public static Printer getPrinter(int flag) { Printer printer = null; if(flag == 0) { printer = new HPPrinter(); } else if(flag == 1) { printer = new CanonPrinter(); } return printer; } } class Test { public static void main(String args []) { int flag = 1; Printer printer = PrinterFactory.getPrinter(flag); printer.open(); printer.print('对象的转型好用吧~'); printer.close(); }} 这样,就算要增加100台打印机,也只用在PrinterFactory中添加 else if(flag == xxx) 的代码,不用修改Test类。 这就是著名的简单静态工厂方法模式。 |
|