虐心,Hello World

简介: 前言无意中在知乎上看到了一个很有意思的回答:https://www.zhihu.com/question/277243683/answer/393676961题目是:如何把一段简单的代码变复杂?答主的回答当然是为了调侃。

前言
无意中在知乎上看到了一个很有意思的回答: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多好玩啊。别走啊...

这里是一帮应届生共同维护的公众号,内容是我们在从应届生过渡到开发这一路所踩过的坑,以及我们一步步学习的记录,如果感兴趣的朋友可以关注一下,一同加油,一同努力

img_39e544ceb47ae92ede4c13f05f18ed09.png
个人公众号:IT面试填坑小分队
目录
相关文章
|
6月前
|
存储 程序员 C语言
【C++】“Hello World!“
【C++】“Hello World!“
49 3
|
5月前
|
C++
C++之Hello,world
C++之Hello,world
10:Hello, World!的大小
10:Hello, World!的大小
99 0
|
C++
L1-001 Hello World
文章目录 L1-001 Hello World (5 分) 总结
95 0
L1-001 Hello World
|
Java
你真的会写Hello World吗
概要 起因A3项目发展2年后,功能较为稳定后 ,准备合并进EagleEye主体项目,遇到了个问题,代码很难merge进EagleEye。暴露了一个问题,代码写得太差。模块化。重新认识一下,如何写代码 入门版Hello World 下面这段经典代码,开始学习的时候,觉得非常的优美。
2616 0
1031. Hello World for U (20)
Given any string of N (>=5) characters, you are asked to form the characters into the shape of U.
938 0