面向接口编程(一)
接口体现的是一种实现和规范分离的设计哲学,利用接口可以降低程序各个模块之间的耦合性,从而提高系统的可扩展性和可维护性。
其中一种模式是简单工厂模式。
设想一个场景,一台Computer要有一组输出设备。一般有两种解决方案,一种是直接与输出设备耦合,及直接组合一个Printer,这样 Computer与Printer之间的耦合非常紧密;另一种是采取松耦合方式,即Computer组合一个Output接口,相当于一个规范,所有的输出设备都要实现这个规范。
在软件设计中,如果采用第一种形式,以后如果想要维护或者拓展输出时,需要修改Computer的源代码,如果只有一台Computer还好,如果有很多,那么这种紧耦合方式会会带来很大的麻烦,那么我现在就来就少一下第二种模式,先说一下简单工厂类。
下面是Computer的简单源码
public class Computer { private Output output; /* * 初始化Output */ public Computer(Output output){ this.output = output; } /* * 获得数据 */ public void getMsg(String msg){ output.getData(msg); } /* * 打印数据 */ public void putMsg(){ output.out(); } }
Output接口
public interface Output { public void getData(String msg); public void out(); }
实现类Printer和AnotherPrinter
public class Printer implements Output{ //存放信息 private String[] printData = new String[10]; //记录引用位数 private int dataNum = 0; //获得输入信息 public void getData(String msg) { if(dataNum > 10){ System.out.println("缓存已满"); }else{ printData[dataNum++] = msg; } } //将输入信息打印 public void out() { for(int dataIndex = 0;dataIndex<printData.length;dataIndex++){ if(printData[dataIndex] != null) System.out.print(printData[dataIndex]); else break; } } }
public class AnotherPrinter implements Output{ //请读者自己实现与Printer不同的细节 public void getData(String msg) { } public void out() { } }
Output工厂和测试
public class OutputFactory { //工厂实例化一个输出设备 public Output getOutput(){ return new Printer(); } //测试 public static void main(String[] args){ OutputFactory of = new OutputFactory(); Computer c = new Computer(of.getOutput()); c.getMsg("hello world "); c.getMsg("你好,世界"); c.putMsg(); } }
这是一个简单的工厂模式,可以分离Computer和Printer,这是如果要维护和拓展只需要将工厂中的return new Printer()改成return new AnotherPrinter()即可,这样使得后期维护
变得非常简单,这是面向接口编程的其中一种思想。