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都是生成的单例,而且所有实例统一管控。这不正是单例模式和工厂模式的思想么?当你真正明白这些思想时,并不会拘泥于这些模式。

另外也说一点,真正好的设计,并不是基于你用了多少设计模式,而是基于你对当前业务和业务扩展性的理解,非要把一些不会扩展的地方写成松耦合,滥用设计模式,只会导致工作量增加和类泛滥!

所以,请所有的面试官们,如果你仍然为自己“懂”那么多设计模式而感觉高高在上,请停止你那些愚蠢的提问,因为很可能一个真正的程序猿就被你的无知给筛掉了。

设计模式体现在每一行追求完美的代码中,而我们无须追寻!
谨以此文献给那些总在力求让自己的代码更加优美,更加易于业务扩展的程序猿们。

我对设计模式不屑一顾相关推荐

  1. 技术图文:02 创建型设计模式(上)

    创建型设计模式(上) 知识结构: 图1 知识结构 简单工厂模式 Sunny 软件公司欲基于 C# 语言开发一套图表库,该图表库可以为应用系统提供各种不同外观的图表,如: 柱状图(histogram) ...

  2. java设计模式之为别人做嫁衣----代理模式

    2019独角兽企业重金招聘Python工程师标准>>> 7.1为别人做嫁衣 "小菜,今天见这个叫娇娇的美女见得如何呀?"大鸟一回家来就问小菜. "唉,别 ...

  3. 设计模式 之 设计的 六大原则(1)单一职责原则

    由于这些原则性东西 属于概念东西,就不具体以代码描述了.以下是摘自网上和自己的一些理解 首先了解一些 面向对象的特性: 面向对象 有 三大基本特征:封装 ,继承, 多态. 封装: 也就是把客观事物封装 ...

  4. PHP 设计模式六大原则

    http://www.cnblogs.com/yujon/p/5536118.html 设计模式六大原则(1):单一职责原则 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责 设计模 ...

  5. 设计模式的分类和六大设计原则

    学习设计模式我是大学研究<java与模式这本书>1024页,很多没有看懂,并且没有总结起来,这次一定要把设计原则和设计模式总结清楚. 设计模式的分类 设计模式分为三大类: 创建型模式,共五 ...

  6. 大话设计模式之设计模式遵循的七大原则

    最近几年来,人们踊跃的提倡和使用设计模式,其根本原因就是为了实现代码的复用性,增加代码的可维护性.设计模式的实现遵循了一些原则,从而达到代码的复用性及增加可维护性的目的,设计模式对理解面向对象的三大特 ...

  7. [转]设计模式六大原则[1]:单一职责原则

    定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的 ...

  8. Java设计模式-单一职责原则

    单一职责原则 [Single Responsibility Principle]   定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责 ...

  9. java设计模式六大原则之场景应用分析

    面对项目中如此众多的设计模式,我们有时候无法 下手.在强大的设计框架也终脱离不了23种设计模式,6大原则.我们只要把内功修炼好,掌握其精髓也离我们不远了... 目录: 设计模式六大原则(1):单一职责 ...

最新文章

  1. 记录win10快捷键
  2. 网络新高速:T比特网络技术实现成功测试
  3. gpu浮点计算能力floaps_聊聊 GPU 峰值计算能力
  4. Access 的top和order by 的问题
  5. 课堂练习之四则运算加强版
  6. PowerDesigner将PDM导出生成WORD文档(转)
  7. hdu2066----------dijkstra模板题
  8. mysql建表后添加约束_MYSQL建表完成之后添加约束
  9. 把WebForm移植到.Net MVC中
  10. 省地县级联操作 http://www.popub.net/script/pcas.html
  11. MATLAB设计不同结构的FIR或IIR滤波器
  12. error C2864 只有静态常量整型数据成员才可以在类中初始化
  13. SQL数据库的查询操作大全(select)
  14. python爬百度贴吧_python爬虫-爬取百度贴吧帖子加图片
  15. sqlserver with 语法
  16. ReactNative--控件小记-更新中
  17. 【Task08】Numpy学习打卡
  18. 计算机视觉顶会影响因子,最新SCI期刊影响因子出炉!
  19. 接口和抽象类的共性与区别
  20. 关于百度题库题目答案遮挡的问题的解决方法

热门文章

  1. python form data request_请问Flask的request.form和request.data有什么区别?
  2. 2022-9-19周报
  3. 易语言操作java窗口,易语言调用JAVA源码
  4. 道相同、谋相通、人相守:华为副总裁周跃峰分享如何与用户精英共创数字基建
  5. 学业水平测试计算机知识点,初中信息技术学业水平考试知识点(操作题)
  6. 前端程序员必知:单页面应用的核心
  7. DDOS攻击解决方法
  8. 编写第一个HelloWorld驱动程序
  9. Python破解网易云音乐下载版权限制
  10. ios html数组,[转载]IOS中字符串与数组的处理