虐心,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多好玩啊。别走啊...
这里是一帮应届生共同维护的公众号,内容是我们在从应届生过渡到开发这一路所踩过的坑,以及我们一步步学习的记录,如果感兴趣的朋友可以关注一下,一同加油,一同努力!!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 多线程 之 Runnable
http://www.verejava.com/?id=16992909097867 package com.thread; /** 注意: 1. 如果要启动一个线程必须调用,start()方法 2. 线程同时运行其实是,CPU分配给每个线程一段时间来顺序执行每个线程 3. 因为java是单继承的,所以为了提高可扩展性,一般使用第二种实现Runnable 的方式 概念上 可以理解为 他们 main MyThread 是同时进行 */ public class TestRunnable { public static void main(String[] args) { //实列话一个线程 MyThread2 t = new MyThread2(); Thread thread = new Thread(t, "汽车线程"); thread.start();//启动线程, run() 会自动调用 Thread thread2 = new Thread(t, "火车线程"); thread2.start();//启动线程, run() 会自动调用 try { for (int i = 0;...
- 下一篇
预警| ECShop全系列版本远程代码执行高危漏洞 阿里云WAF已可防御
2018年9月1日,阿里云态势感知发布预警,近日利用ECShop全系列版本的远程代码执行漏洞进行批量化攻击量呈上升趋势,该漏洞可直接导致网站服务器沦陷,黑客可通过WEB攻击直接获得服务器权限,利用简单且危害较大。因此,阿里云安全专家提醒ECShop系统用户及时进行修复。 早在1个月前阿里云态势感知就捕获到利用ECShop远程代码执行漏洞进行攻击的真实案例,由于当时该漏洞被利用进行攻击的量不大,阿里云安全团队在做好防御此类漏洞大规模利用攻击的同时,也持续监控该漏洞的利用趋势。 本文对此漏洞的原理,漏洞攻击利用实例以及影响做了全面分析。在官方补丁没放出之前,建议受影响用户可参考文中的修复建议,及时进行修复。使用阿里云WAF的客户无需升级补丁即可防御该漏洞。 漏洞原理 该漏洞产生的根本原因在于ECShop系统的user.php文件中,displ
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)