基于java的设计模式入门(1)——为什么要学习设计模式
大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康。
过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了。提高自己,无非就有两种方式,一是看书学习,二是实践体悟。起码有两个月没怎么看过专业书和写过代码了,现在趁过年这段时间赶紧看看书,给自己充充电。
为什么要学习设计模式
在学校里面学习一些基础编程课程之后,例如掌握一门编程语言,以及学习算法与数据结构,难道我们就掌握了编程的全部了么?当然不是,如果我们只是满足于写出所谓正确的代码,输入变量,得出结果,哪怕从事了几年的软件开发都还是处在编写简单逻辑代码+复制粘贴层次。
这次的学习主要的参考资料就是程杰老师的《大话设计模式》。在程杰老师的书中,举了一个非常经典的例子,我就稍微改一改,算是照搬过来,跟童鞋们一起进行学习,体会一下,什么才是面向对象,什么才叫可维护、可复用、可扩展、灵活性好。多说一句,这是我见过的解释得最生动,最精彩的例子,没有之一。
三国演义大家都应该看过或者听说过,前两年电视剧《新三国》也火过好一阵子。据说曹操率兵攻打东吴,号称百万大军,而东吴据说只有几万兵马。曹军驻扎赤壁,浩浩荡荡,一望无际。曹操觉得统一天下应该是没问题了,那就先庆祝一下吧,所以就搞了个大Party。吃饱喝够之后呢,曹操突然觉得要显示一下自己的逼格,就出口成诗,吟道:“喝酒唱歌,人生真爽。······”。下面的文臣武将纷纷表示“好诗啊好诗”。这时候一个精于奉承的臣子就赶紧召集工匠刻板印刷,让主公诗名远扬,到时候自己好处肯定是少不了。

赶紧先印出来几张样板呈给曹操过目,曹操想了想,觉得不对,说:“喝和唱,觉得用在这里怎么有点俗气,改为‘对酒当歌’比较好。改!”。于是,工匠就很郁闷地去返工,重新刻板了。

改过之后,曹操又想了想,觉得还不够好,觉得“人生真爽”太过直白,应该改一改,说道:“当为‘人生几何’为妙。再改!”。工匠一听,只好再次加班。

在三国时期,活字印刷还没有发明出来,所以要改字的时候,就必须要整个刻板重新刻。而且,在刻字的时候,只要刻错一个字,就必须整个板废弃掉,重新刻。所以说,曹操这样的行为就有点像客户的需求变更一样,如果我们的软件开发还像雕版印刷那样,就算是天天加班都无济于事。看到活字印刷,只要更改四个字就可以了,而且不用全部重新推倒 重来。

为什么说活字印刷术基本符合了软件工程的四个要求呢?第一,要进行改动的话,只需要更改要改的字,这是可维护;第二,这些字并不是用完这次就没用了,完全可以在后来的印刷中重复使用,这是可复用;第三,如果这首诗要加字,主要另外刻字就可以了,这是可扩展;第四,字的排列其实可能是竖排可能是横排,只需要将活字移动就可以满足不同的排列需求,这是灵活性好。
我们之所以要学习设计模式,并不是把具体的某些模式原原本本地照搬来用,而是通过学习这些模式,了解到底什么是“封装变化”,“对象间松耦合”,“针对接口编程”等概念,从而设计出符合前面所讲到四个特性——易维护,易扩展,易服用,灵活性好的程序。在书中,说道学习设计模式有四个层次,分别是
- 没学之前是一点不懂,根本想不到用设计模式,写出的代码很糟糕;
- 学了几个模式之后,于是总想着要用自己学过的模式,于是时常造成误用模式而自己却不知道;
- 学完全部的模式之后,感觉模式之间都很相似,分不清差异,有困惑,但深知误用设计模式的害处,应用之时很犹豫
- 灵活应用模式,甚至不应用具体的某种模式也能设计出非常优秀的代码,以达到无剑胜有剑的境界。
为什么说是基于java的设计模式入门?
其实设计模式是不太分哪一种语言的,估计只要是面向对象就行,例如C++、java等等。我这次的参考材料主要是程杰老师的《大话设计模式》,而里面的例子都是用C#写的,说实话看得并不是很爽。再加上我想着通过写博客来帮助我学习设计模式,所以就决定在看书的同时,通过举例java程序来描述整一个过程。
在学校的时候,《算法与数据结构》的课本我见过有基于C++的和Java的。这就说明,虽然算法与数据结构是通用的,但是在特定的讲授当中,为了能够更方便学员读懂例子和实际编译运行,用不同的语言诠释也是挺有必要的。
我的更新计划
打算通过七到十篇博客来进行这次的入门学习,就在元宵节前完成,所以至少实现两天一篇的更新,希望童鞋们监督我咯。
闲聊几句
不知道大家会不会跟我有差不多的感觉,就是会觉得过年越来越没意思了,跟小时候简直没法比。至少我就是这样,每年春节都觉得有点无聊,还得贴春联,浆糊脏手。自从上了大学有了几百几千块自己可以自主支配的生活费之后,已经很难为过年的四位数左右的压岁钱感到激动了。不过这几天自从更新了微信5.2之后,新增的“新年红包”功能又重新对红包有了感觉。
新年红包有两种,拼手气群红包和普通红包。其实都很好理解,普通红包就是送给特定一个人,规定金额。比较有意思的是群红包,限定总额和个数,每个红包随机的金额,能拿多少就全拼手气了,挺有意思。如果想发红包,必须要绑定银行卡,开通微信支付,同样地,如果想把拿到的红包提现,也必须这样做。
这个功能一出来,很多人都玩得不亦乐乎,而一些互联网名人也赞不绝口。丁香园CTO、小道消息的冯大辉就说了,新年红包这个功能的团队应该拿腾讯的年度最佳产品奖。的确,这样一个免费的扩展用户群的策略,无疑要比最近打的送钱优惠免单要来得高明得多。
推广,有时候并不需要所谓的广告,你做的好了、有趣了,大家自然而然会去用,会介绍别人一起玩。我现在写文章也是,更乐意专注于把东西写得有趣,去想别人会想读到什么样的内容。往这个方向想,只要努力对了,最后肯定是,大,家,开,心。
PS:喜欢我的闲聊么?其实我有一个微信公众账号,上面几乎每天都会发一篇文章,基本上都是类似这样的内容,就是我的一些经历感悟和想法看法。如果感兴趣的话,可以在公众号中搜索“华工小Y”添加关注。
基于java的设计模式入门(1)——为什么要学习设计模式的更多相关文章
- 选择适合入门的自动化测试框架TestNG 基于Java语言的入门选择之一
对于测试工程师新手来说,最痛苦的莫过于入门,其实只要入门3个月左右,对于自动化测试,所有的测试工程师除了喜爱,就是更爱.自动化测试工作,是从根本上解放人性,不用重复去完成鼠标的点点点,例如以下测试常常 ...
- Spring入门(8)-基于Java配置而不是XML
Spring入门(8)-基于Java配置而不是XML 本文介绍如何应用Java配置而不是通过XML配置Spring. 0. 目录 声明一个简单Bean 声明一个复杂Bean 1. 声明一个简单Bean ...
- JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...
- JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC
接上篇<JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP.IOC)>,了解了Spring的核心(AOP.IOC)后,我们再来学习与实践Maven.Sp ...
- Spring框架入门之基于Java注解配置bean
Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...
- 【设计模式】第一篇:概述、耦合、UML、七大原则,详细分析总结(基于Java)
迷茫了一周,一段时间重复的 CRUD ,着实让我有点烦闷,最近打算将这些技术栈系列的文章先暂时搁置一下,开启一个新的篇章<设计模式>,毕竟前面写了不少 "武功招式" 的 ...
- Spring入门学习笔记(2)——基于Java的配置
目录 基于Java的配置 @Configuration & @Bean Annotations Example 注入Bean依赖 @Import注解 Lifecycle Callbacks(声 ...
- 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)
微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...
- Java入门-浅析Java学习从入门到精通【转】
一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 ...
随机推荐
- java中super的两种用法
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...
- css3之背景新属性
background属性 属性 描述 background-origin 背景图片的定位区域 background-size 背景图片尺寸 background-image:url(),url();允 ...
- CVTE实习面经
一个月的实习都结束了,我才把这篇面经放出来...可能有记得不太清楚的地方,还请多多见谅. 第一次面试是在5月中旬. 这次面试问的主要是基础的问题吧,就是C和C++的基础问题,我记得有问到下面几个问题 ...
- linux下搭建nagios
配置环境:1)CentOS 6.5 作为监控主机,IP:10.0.0.30(根据自己公司需要改变) 2)客户机: windows server 2008R2 , windows 7, windows ...
- C语言题库的上机题
1.编写函数,实现从键盘上输入一个小写字母,将其转化为大写字母. #include<stdio.h> int zhuanhua(char s); void main(){ char s; ...
- hdu 5976 Detachment
Detachment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Raab判别法确定级数是否收敛
- [fortify] 不安全的函数eregi()
PHP 5.4/5.3弃用函数eregi() memory_limit绕过漏洞 [日期:2012-04-02] 来源:Linux社区 作者:Linux [字体:大 中 小] 发布日期:2012- ...
- Spring 学习笔记 7. 尚硅谷_佟刚_Spring_Bean 的作用域
1,理论 •在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. •默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创 ...
- Xml生成节点声明
XmlDocument xmlDoc = new XmlDocument(); XmlDeclaration declaration = xmlDoc.CreateXmlDeclaration(&qu ...