前言
无意中在知乎上看到了一个很有意思的回答:https://www.zhihu.com/question/277243683/answer/393676961题目是:如何把一段简单的代码变复杂?
答主的回答当然是为了调侃。不过我觉得这倒是一个比较好玩的主题。Hello World作为我们编程语言入门的内容,是一个很简单很简单的一行代码。但是,当我们结合设计模式,抽象、多态、封装...的概念之后,我们的Hello World就变得异常的复杂。
今天就让我们从简单的Hello World,一步步进化成“花里胡哨”的Hello World。
开始
开始之前,为了文章的娱乐性,整俩个小角色:刚开始学习编程的小A,以及吃不上饭的Android开发MDove。
Mdove:小A啊,Java也学了很久了。Hello World会不会写啊?
小A:必须会,我Hello World写的贼6~
public class HelloWorldMain {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
MDove:兄dei,这样写怎么能体现面向对象的思想?你得抽成一个对象啊!
小A:说得对,说得对!必须抽。
public class HelloWorldMain {
public static void main(String[] args) {
new HelloWorld().fun();
}
}
public class HelloWorld {
public void fun(){
System.out.println("Hello World");
}
}
MDove:这样怎么能行呢?fun方法可能会有多种实现呐,不一定只输出Hello World。万一需求让输出Hello Java咋整?不能光面向对象,还得学会抽象。是不是得抽一个接口出来?使用的时候,具体类去具体实现?!
小A:dei,dei,dei,说的dei。必须上接口。
public class HelloWorldMain {
public static void main(String[] args) {
new HelloWorld().fun();
}
}
public class HelloWorld implements IHelloWorld{
@Override
public void fun(){
System.out.println("Hello World");
}
}
public interface IHelloWorld {
void fun();
}
MDove:抽象是抽象出来了,当时这样new出来对象,实在是太low了。让我们加个设计模式,就用简单工厂了。
小A:好好好,大哥说什么都对。
public class HelloWorldMain {
public static void main(String[] args) {
new SayHelloFactory().create().fun();
}
}
public class SayHelloFactory {
public IHelloWorld create(){
return new HelloWorld();
}
}
MDove:不行不行,这样还是去new对象。耦合度是在是太高!我们这样做:把我们要初始化的对象写在xml里,然后通过反射去new这个对象!
小A:好呀,好呀!(MMP)
public class HelloWorldMain {
public static void main(String[] args) {
//省略try-catch
Class object=Class.forName("从文件中得到需要加载的类路径");
Constructor constructor=object.getConstructor(null);
Object helloWorld=constructor.newInstance(null);
Method sayHellod=object.getMethod("fun", null);
sayHellod.invoke(helloWorld, null);
}
}
MDove:不行!这么写不够高端。咱们用动态代理,这样咱们就能够对咱们的类有足够强的控制力和拓展力!
小A:......(怎样动手能算是“正当防卫”呢?)
public class HelloWorldMain {
public static void main(String[] args) {
Class object = Class.forName("com.HelloWorld");
Constructor constructor = object.getConstructor(null);
final Object helloWorld = constructor.newInstance(null);
IHelloWorld iHelloWorld = (IHelloWorld) Proxy.newProxyInstance(helloWorld.getClass().getClassLoader(),
helloWorld.getClass().getInterfaces(), new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(helloWorld, null);
}
});
iHelloWorld.fun();
}
}
MDove:这样勉强还不错,不过每次都这么写太麻烦。我们封装一个框架让它能够帮我们处理这些内容!让我们参考Spring写一个吧!
小A:饿错咧,饿真滴错咧,饿从一开始就不应该学Java...饿如果不学Java,饿就会有一头乌黑亮丽的头发...
MDove:别呀,Java多好玩啊。别走啊...