public class OutputterFactory
{ 6
IOutputter Create(String outputter)
{ 7
if (outputter.equalsIgnoreCase("TXTOutputter"))
{ 8
return new TXTOutputter(); 9
} 10
else if(outputter.equalsIgnoreCase("XMLOutputter"))
{ 11
/**//*return new XMLOutputter();*/ 12
} 13
return null; 14
} 15
16
}
到了目前这个状态,似乎我们的问题得到了解决。我们可以随时的改变我们的输出方式。而没有太多的代价。测试系统也在此基础上如火如荼的开发着。好景不长,很多在此基础上开发的程序员,提出了一个需求,那就是他们的测试系统同时需要有两种或两种以上的输出方式,在传输到数据库里的同时还需要在本地输出一份报告。 这时你会说,你可以在测试系统中创建两种输出方法对象不就行了嘛,然后在“需要输出的地方”调用两次就行了。这个确实是一个不负责任的说法。(经常能见到这样的设计师),对客户程序带来的烦麻也显而易见。
那我们就来看来如何解决这样的问题,首先,总结一下问题描述。在测试系统中,
测试报告具有相同的输出内容类型
测试报告需要有不同的输出形式(方式)
测试报告可能同时需要有两种或两种以上的输出形式
客户程序无需感知有多种输出方式存在
这时,往往有程序员会打开《设计模式》去寻找解决的方案,这真的是不好的方法,或者是找不到现成的模式,或者模式的误用就发生了。好在,这个确实是模式的一种也许你可能找得到,但我还是不建议套用模式的方式解决问题。接下来我们看看通过自己分析来解决问题,和现存模式有什么区别。
根据问题描述4可以看得出,多种输出同时生效对于客户程序是透明的,也就是说,客户程序对于多种输出方式的调用和单个输出方式的调用具有相同的接口,另外,多种输出方式是并列的关系,并不存在层次关系。我们可能根据客户程序调用形式想到,若我们将生成的一个或多个输出对象存储在一个容器内部,并且让这个容器也具用输出内容接口。当对于这个容器调用输出内容接口的时候,就将这个操作依次传递给容器内所用对象。 哦~!原来是这样,就可以解决同时多种输出的问题,并且从客户角度看,只是对一个简单输出对象接口的调用,而完全不知,此时已是复杂对象了。
Code 1
package my.cnblog.output; 2
import java.util.Vector; 3