1.传统打印HelloWorld
void main(String args[]) {
System.out.println("Hello World!");
}
优点:逻辑清晰,易读。
缺点:不可扩展:
a.新需求想要打印HelloWorld但是要放到html标签中,需要改代码。
b.新需求想要使用System.err.println()方式打印,需要改代码。
2.改进方式,使用面向对象设计解耦合
因为打印方式和打印内容可能会有改动,所以抽出来两个接口,一个负责提供打印内容,一个负责执行打印方式。
执行打印方式接口:
public interface MessageRender {
/**
* 打印消息
*/
void render(String msg);
}
提供打印内容接口:
public interface MessageProvider {
/**
* 提供消息
*
* @return
*/
String getMessage();
}
执行打印方式接口实现类:
public class HelloWorldMessageRender implements MessageRender {
public void render(String msg) {
System.out.println(msg);
}
}
执行打印内容接口实现类:
public class HelloWorldMessageProvider implements MessageProvider {
public String getMessage() {
return "Hellow World!";
}
}
程序入口类:
public class HelloWorldDecoupled {
public static void main(String[] args) {
// 消息提供方
MessageProvider messageProvider = new HelloWorldMessageProvider();
// 消息打印方
MessageRender messageRender = new HelloWorldMessageRender();
// 打印
messageRender.render(messageProvider.getMessage());
}
如现在新需求需要用err的方式打印出html串
实现MessageProvider
public class HelloWorldHtmlMessageProvider implements MessageProvider {
public String getMessage() {
return "<html> <a href='http://www.baidu.com'>I am html</a></html>";
}
}
实现MessageRender
public class HelloWorldErrorMessageRender implements MessageRender {
public void render(String msg) {
System.err.println(msg);
}
}
public class HelloWorldDecoupled {
public static void main(String[] args) {
// 消息提供方
MessageProvider messageProvider = new HelloWorldHtmlMessageProvider();
// 消息打印方
MessageRender messageRender = new HelloWorldErrorMessageRender();
// 打印
messageRender.render(messageProvider.getMessage());
}
}
至此,添加新的打印方式和打印内容只需要修改程序入口类即可。
为了完全解耦合,在新需求来的时候不需要改动之前的代码,只需新增代码,我再新建一个工厂,使用配置文件去解耦。
工厂类:
public class MessageSupportFactory {
private static MessageSupportFactory instance;
private Properties props;
private MessageRender messageRender;
private MessageProvider messageProvider;
static {
instance = new MessageSupportFactory();
}
private MessageSupportFactory() {
props = new Properties();
try {
props.load(this.getClass().getResourceAsStream("/hello.properties"));
messageRender = (MessageRender) Class.forName(props.getProperty("render.class")).newInstance();
messageProvider = (MessageProvider) Class.forName(props.getProperty("provider.class")).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public MessageRender getMessageRender() {
return messageRender;
}
public MessageProvider getMessageProvider() {
return messageProvider;
}
public static MessageSupportFactory getInstance() {
return instance;
}
}
配置文件:
provider.class=fashion.helloworld.HelloWorldMessageProvider
render.class=fashion.helloworld.HelloWorldMessageRender
此时的启动类:
public class HelloWorldDecoupled {
public static void main(String[] args) {
MessageSupportFactory factory = MessageSupportFactory.getInstance();
// 消息提供方
MessageProvider messageProvider = factory.getMessageProvider();
// 消息打印方
MessageRender messageRender = factory.getMessageRender();
// 打印
messageRender.render(messageProvider.getMessage());
}
}