前言
無意中在知乎上看到了一個很有意思的回答:
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多好玩啊。别走啊...
這裡是一幫應屆生共同維護的公衆号,内容是我們在從應屆生過渡到開發這一路所踩過的坑,以及我們一步步學習的記錄,如果感興趣的朋友可以關注一下,一同加油,一同努力!!

個人公衆号:IT面試填坑小分隊