我对设计模式不屑一顾
2011年在金蝶,部门组织了一个培训,由一个资深的老前辈(纪大松)讲了一次23种设计模式,当时懵懵懂懂,对设计模式不屑一顾。如今时隔6年,忙里偷闲,我又将23种设计模式看了一遍,依然不屑一顾。6年前不屑一顾,其实是似懂非懂,如今不屑一顾,就真的是不屑一顾了。
说不屑一顾,并不是说设计模式没有屌用,反而,我对总结出这套理论的大牛们心存感激亦存尊重。我想表达的是,“设计”,“模式”这两个词看起来似乎很高大上,好像自己沾点边那就跟架构师乃至技术总监相隔不远了,但却并不如大家想象的那样遥远和高深。
我面过一些人,也被很多人面过,在面试java时设计模式是很常见的话题,很遗憾的是,几乎所有人讨论的都是设计模式本身,诸如:你用过哪些设计模式啊?原理什么样的?画个类图看看?使用场景有哪些?门面模式和代理模式有什么区别等等。我曾经遇见过一位同事,可以说是个技术面很广的人,你随便说个技术名词能跟你讲一大堆,23种设计模式你随便挑一个,他都能准确的帮你把概念,类图,优缺点,适用于哪些场景“背”出来。但是看过他的代码后,我很悲哀。
在我认为,真正懂得设计模式的人,是不需要去记那些繁琐的名词以及概念的,因为“设计模式”对他们来说是“不屑”的(除非他刻意去记)。因为:
1.设计模式只是一些优秀经验的积累,
举个栗子:老板说要模拟一个小孩哭的场景,这小孩一哭就哇哇哇。
报告老板,写完了。
public class Baby { public void cry() { System.out.println("wa wa wa!"); }}
老板又说了,家里有条狗,小孩一哭,狗也跟着叫。
好吧,改一改,先加条狗:
public class Dog { public void bark() { System.out.println("汪汪汪!"); }}
然后,小孩一哭,狗就跟着叫
public class Baby {
private Dog dog;
public void cry() { System.out.println("哇哇哇!"); if (dog != null) dog.bark(); } public Dog getDog() { return dog; }
public void setDog(Dog dog) { this.dog = dog; }}
老板又说了,主人还养了猫,猫也跟着叫
好,再改
public class Cat { public void bark() { System.out.println("喵喵喵!"); }}public class Baby {
private Dog dog;
private Cat cat;
public void cry() { System.out.println("哇哇哇!"); if (dog != null) dog.bark(); if (cat != null) cat.bark(); }
// getter and setter}
老板又说了,还有鸡,鸡还不少,好多只。
如果你还认为要这样继续加下去我觉得你是一个不合格的程序猿,我相信大部分人肯定会寻思怎么改了,怎么更容易让老板的需求变得容易实现:
先抽象一个动物,dog和cat直接实现它
public interface Animal { void bark();} public class Cat implements Animal { public void bark() { System.out.println("喵喵喵!"); }}public class Dog implements Animal { public void bark() { System.out.println("汪汪汪!"); }}
然后改Baby
public class Baby {
private List<Animal> animals = new ArrayList<Animal>();
public void cry() { System.out.println("哇哇哇!"); for (Animal animal : animals) { animal.bark(); } }
public void addAnimal(Animal animal) { animals.add(animal); }
// getter and setter}
现在好了,老板,你家爱有多少动物就有多少吧。
我相信任何一个不懂设计模式的程序猿,稍微有些工作经验,只要有心优化这段代码,不想再被老板无休止得加动物而烦恼,这段代码写出来并不难,而这就是23种设计模式中的监听者模式。即使你连设计模式是什么也不知道,只要有心写上若干年,某天突然来看,你会发现,几乎所有的设计模式你都用过。
2.设计模式更多的只是一种思想,而不在于代码
再举个例子,还是小孩哭,小孩一哭妈妈就喂奶。某某对于设计模式非常“精通”,于是这样写:
public interface IMother { void nurse();}public class Mother implements IMother { public void nurse() { System.out.println("乖宝宝别哭!"); }}public class Baby {
private List<Mother> mothers = new ArrayList<Mother>();
public void cry() { System.out.println("哇哇哇!"); for (Mother mother : mothers) { mother.nurse(); } }
public void addMother(Mother mother) { mothers.add(mother); }
// getter and setter}
不好意思,老板,作为一个老司机,你所有的需求变化都在我的预料之中,随便你怎么变,我都能满足你,因为我用了设计模式中的监听者模式!!
老板:你他妈脑袋有包,小孩能有几个妈???
spring mvc的controller,service类并没有要求写成单例模式,也没有写工厂,但是实际上这些类spring都是生成的单例,而且所有实例统一管控。这不正是单例模式和工厂模式的思想么?当你真正明白这些思想时,并不会拘泥于这些模式。
另外也说一点,真正好的设计,并不是基于你用了多少设计模式,而是基于你对当前业务和业务扩展性的理解,非要把一些不会扩展的地方写成松耦合,滥用设计模式,只会导致工作量增加和类泛滥!
所以,请所有的面试官们,如果你仍然为自己“懂”那么多设计模式而感觉高高在上,请停止你那些愚蠢的提问,因为很可能一个真正的程序猿就被你的无知给筛掉了。
设计模式体现在每一行追求完美的代码中,而我们无须追寻!
谨以此文献给那些总在力求让自己的代码更加优美,更加易于业务扩展的程序猿们。
我对设计模式不屑一顾相关推荐
- 技术图文:02 创建型设计模式(上)
创建型设计模式(上) 知识结构: 图1 知识结构 简单工厂模式 Sunny 软件公司欲基于 C# 语言开发一套图表库,该图表库可以为应用系统提供各种不同外观的图表,如: 柱状图(histogram) ...
- java设计模式之为别人做嫁衣----代理模式
2019独角兽企业重金招聘Python工程师标准>>> 7.1为别人做嫁衣 "小菜,今天见这个叫娇娇的美女见得如何呀?"大鸟一回家来就问小菜. "唉,别 ...
- 设计模式 之 设计的 六大原则(1)单一职责原则
由于这些原则性东西 属于概念东西,就不具体以代码描述了.以下是摘自网上和自己的一些理解 首先了解一些 面向对象的特性: 面向对象 有 三大基本特征:封装 ,继承, 多态. 封装: 也就是把客观事物封装 ...
- PHP 设计模式六大原则
http://www.cnblogs.com/yujon/p/5536118.html 设计模式六大原则(1):单一职责原则 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责 设计模 ...
- 设计模式的分类和六大设计原则
学习设计模式我是大学研究<java与模式这本书>1024页,很多没有看懂,并且没有总结起来,这次一定要把设计原则和设计模式总结清楚. 设计模式的分类 设计模式分为三大类: 创建型模式,共五 ...
- 大话设计模式之设计模式遵循的七大原则
最近几年来,人们踊跃的提倡和使用设计模式,其根本原因就是为了实现代码的复用性,增加代码的可维护性.设计模式的实现遵循了一些原则,从而达到代码的复用性及增加可维护性的目的,设计模式对理解面向对象的三大特 ...
- [转]设计模式六大原则[1]:单一职责原则
定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的 ...
- Java设计模式-单一职责原则
单一职责原则 [Single Responsibility Principle] 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责 ...
- java设计模式六大原则之场景应用分析
面对项目中如此众多的设计模式,我们有时候无法 下手.在强大的设计框架也终脱离不了23种设计模式,6大原则.我们只要把内功修炼好,掌握其精髓也离我们不远了... 目录: 设计模式六大原则(1):单一职责 ...
最新文章
- 记录win10快捷键
- 网络新高速:T比特网络技术实现成功测试
- gpu浮点计算能力floaps_聊聊 GPU 峰值计算能力
- Access 的top和order by 的问题
- 课堂练习之四则运算加强版
- PowerDesigner将PDM导出生成WORD文档(转)
- hdu2066----------dijkstra模板题
- mysql建表后添加约束_MYSQL建表完成之后添加约束
- 把WebForm移植到.Net MVC中
- 省地县级联操作 http://www.popub.net/script/pcas.html
- MATLAB设计不同结构的FIR或IIR滤波器
- error C2864 只有静态常量整型数据成员才可以在类中初始化
- SQL数据库的查询操作大全(select)
- python爬百度贴吧_python爬虫-爬取百度贴吧帖子加图片
- sqlserver with 语法
- ReactNative--控件小记-更新中
- 【Task08】Numpy学习打卡
- 计算机视觉顶会影响因子,最新SCI期刊影响因子出炉!
- 接口和抽象类的共性与区别
- 关于百度题库题目答案遮挡的问题的解决方法
热门文章
- python form data request_请问Flask的request.form和request.data有什么区别?
- 2022-9-19周报
- 易语言操作java窗口,易语言调用JAVA源码
- 道相同、谋相通、人相守:华为副总裁周跃峰分享如何与用户精英共创数字基建
- 学业水平测试计算机知识点,初中信息技术学业水平考试知识点(操作题)
- 前端程序员必知:单页面应用的核心
- DDOS攻击解决方法
- 编写第一个HelloWorld驱动程序
- Python破解网易云音乐下载版权限制
- ios html数组,[转载]IOS中字符串与数组的处理