基于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基础的类库 ...
随机推荐
- 在Xcode中使用Git进行源码版本控制
http://www.cocoachina.com/ios/20140524/8536.html 资讯 论坛 代码 工具 招聘 CVP 外快 博客new 登录| 注册 iOS开发 Swift Ap ...
- 深入浅出UML类图(一)
在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...
- C#装箱和拆箱
1.装箱是将值类型转换为引用类型(或者转换为此值类型所实现的任何接口类型)的隐式转换,当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上. ; / ...
- openjudge2985(数字组合)
描述 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式.如:n=5,5个数分别为1,2,3,4,5,t=5:那么可能的组合有5=1+4和5=2+3和5=5三种组合方式.输入输入的第一行是两 ...
- flask_日期和时间
不知道大家有没有发现,在我们学习flask的过程中,post的timestamp字段添加时间时一直用的是datetime.utcnow()来获取时间,但是它获取的时间跟本地时间不一样,下面我们来测试一 ...
- 20151011 C# 第一篇 运算符
20151011 表达式: 表达式是由运算符和操作数组成的. 运算符: 1. 算数运算符 运算符 说明 备注 + 加 ++M 前缀增量操作 该操作的操作结果是操作数加 1 之后的值 M++ 后缀增量操 ...
- INotifyPropertyChanged接口的PropertyChanged 事件
INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知. 例如,考虑一个带有名为 FirstName 属性的 Person 对象. 若要提供 ...
- JavaScript标准库之——JSON
JSON 对象包含了两个方法,一是解析 JavaScript Object Notation (JSON),二是将值转换为 JSON.这个对象本身不能被调用或者作为构造函数,除了它的这两个方法属性外 ...
- 多进程模块multiprocessing的使用
该模块提供如下功能: 建立并管理运行指定函数的子进程 基本接口: 1 Process(group, target, name, args[, kwargs]): 初始化子进程对象 2 p.daemon ...
- struts2 validation.xml 注意点
1.首先应该注意validation.xml的名字,一定要以Action的类名加“-validation.xml”作为文件名.入LoginAction-validation.xml. 2.LoginA ...