您现在的位置是:首页 > 文章详情

虐心,Hello World

日期:2018-09-02点击:358

前言
无意中在知乎上看到了一个很有意思的回答: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面试填坑小分队
原文链接:https://yq.aliyun.com/articles/636425
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章