1.假如有一个Busisness类要用到一个Printer类来输出内容,可以这样写
package com.test; public class TestInterfaceOne { public static void main(String args[]) { Business business = new Business(); business.UsePrinterToPrint(); } } class Business { public void UsePrinterToPrint() { PrinterA printerA = new PrinterA(); printerA.print(); } } class PrinterA { public void print(){ System.out.println("this is printed by PrinterA"); } }
2.但是注意到Printer类现在是PrinterA,以后还可能被替换为PrinterB,PrinterC,PrinterX...,要替换的话会频繁改动Business里面的UsePrinterToPrint()里面的代码,
所以抽象出一个接口类IPrinter,像这样:
package com.test; public class TestInterfaceTwo { public static void main(String args[]) { Business business = new Business(); business.UsePrinterToPrint(); } } class Business { public void UsePrinterToPrint() { IPrinter printer = new PrinterB(); printer.print(); } } interface IPrinter { public void print(); } class PrinterA implements IPrinter { public void print(){ System.out.println("this is printed by PrinterA"); } } class PrinterB implements IPrinter { public void print(){ System.out.println("this is printed by PrinterB"); } }
3.改成接口后,以后每次更换Printer,只需要改动UsePrinterToPrint()里面new出来的Printer就行了,
但是这样子仍然要改动Business里面的代码,如果改动一个类后需要改动另一个类的代码,那么就说这两个类之间有依赖关系,
为了不让Business与不同的Printer之间有依赖关系,使得以后可以不改动Business的代码,
我们引入了一个工厂类PrinterFactory作为他们之间的"中介",由PrinterFactory来决定要生产出哪一个Printer来给Business用,像这样:
package com.test; public class TestInterfaceThree { public static void main(String args[]) { Business business = new Business(); business.UsePrinterToPrint(); } } class Business { public void UsePrinterToPrint() { new PrinterFactory().getPrinter().print(); } } class PrinterFactory { public IPrinter getPrinter() { return new PrinterB(); //return new PrinterA; } } interface IPrinter { public void print(); } class PrinterA implements IPrinter { public void print(){ System.out.println("this is printed by PrinterA"); } } class PrinterB implements IPrinter { public void print(){ System.out.println("this is printed by PrinterB"); } }
4. 这样,以后我们要更换Printer,只需要改动工厂PrinterFactory里面的getPrinter()方法就行了,不用改动Business里面的代码