天天看點

虐心,Hello World

前言

無意中在知乎上看到了一個很有意思的回答:

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多好玩啊。别走啊...

這裡是一幫應屆生共同維護的公衆号,内容是我們在從應屆生過渡到開發這一路所踩過的坑,以及我們一步步學習的記錄,如果感興趣的朋友可以關注一下,一同加油,一同努力!!

虐心,Hello World

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

繼續閱讀