定义的Output接口
public interface Output
{
//接口里定义的成员变量只能是常量
int MAX_CACHE_LINE = 50;
//接口里定义的普通方法只能是public的抽象方法
void out();
void getData(String msg);
//在接口里定义的默认方法,需要用default修饰
default void print(String... msgs)
{
for(String msg:msgs )
{
System.out.println(msg);
}
}
//在接口中定义类方法,需要用static修饰
static String staticTest()
{
return "接口里的类方法";
}
}
定义的实现类
//让Printer 类实现Output接口
public class Printer implements Output
{
private String[] printData = new String[MAX_CACHE_LINE ];
//用以记录当前需要打印的作业数
private int dataNum = 0;
@Override
public void out()
{
//只要还有作业,就继续打印
while(dataNum>0)
{
System.out.println("打印机打印:"+printData[0]);
//把作业队列整体前移一位,并将剩下的作业数减1
System.arraycopy(printData,1,printData,0,--dataNum);
}
}
@Override
public void getData(String msg)
{
if(dataNum>=MAX_CACHE_LINE )
{
System.out.println("输出队列已满,添加失败");
}
else
{
//把打印数据添加到队列里,已保存数据的数量加1
printData[dataNum++] = msg;
}
}
}
Computer类
public class Computer
{
private Output out;
public Computer(Output out)
{
this.out = out;
}
//定义一个模拟获取字符串输入的方法
public void keyIn(String msg)
{
out.getData(msg);
}
//定义一个模拟打印的方法
public void print()
{
out.out();
}
}
用Output工厂生产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.keyIn("这是一个简单工厂模式");
c.print();
}
}
总结
- 如果使用Computer类直接使用Printer类里的打印方法
- 但是当Printer类发生改变,则需要把全部Computer类里的Printer对象改写,工作量大
- 所以定义一个Output接口,里面有着获取信息,和打印信息的方法
- 用Printer类实现Output接口,并重写其中的两个方法
- 将Computer类与Output接口耦合
- 在使用Output工厂负责产生Output对象
【备注】
①
public Output getOutput()
{
return new printer();
}
②
public Computer(Output out)
{
this.out = out;
}
③
Computer c = new Computer (of.getOutput());
这三者之间发生了向上转型;因为Printer类实现了Output接口,相当于Printer类是Output接口的子类。
Parent p = subClass();