Java写一套漂亮的代码，哪些设计模式比较常用？
大家应该都能说几个自己常用的模式出来，我倒觉得没有必要纠结一个设计模式的列表，不如说说设计模式的学习过程，了解了这个过程，你会发现哪些模式比较常见可能并非最重要的问题。 第一阶段：手中无剑，心中无剑 初步掌握一门面向对象编程语言，了解了类、对象、接口等概念。听别人说到“设计模式”感觉特别高大上，自己不太懂，也用不太起来。 第二阶段：手中有剑，心中无剑 既然不太懂，那就学呗。四人帮经典23式开始一招一招比划。但此时手中虽有了重剑，却不太能舞起来。如果说某人第一次看《设计模式》，就看得通透的话，那我真是佩服得五体投地。 主要原因是，刚开始学习设计模式的人，开发经验一般相对较少，此时我们还缺乏实际经历的应用场景去做参考，看着书中的例子很难感同身受，比如我们看到“封装XX变化性”之类的描述很难引起共鸣。而且很有可能模式的描述和场景压根就不太明白。 但是没关系，此时我们也能像模像样喊出几个招式了，也基本有个感性认识，虽然实际工作中还不太有感觉。 第三阶段：手中有剑，心中有剑 随着自己的学习和开发经历的丰富，你已经对设计模式有一定理解了。在阅读开源代码，或者身边高手的代码时，你经常可以发现可以对应于某模式，因为类命名会出现设计模式中的术语，Factory, Builder，Strategy等。你逐渐明白了某个模式用在某个地方能起到什么作用，你经常会有一种"Wow"的赶脚。 这时你在编程过程中，能够照猫画虎的用设计模式了。而且你开始学习面向对象设计原则，比如SOLID原则也有了一定的理解。你跟别人讨论时，可以大声地说：让我们使用一个XX模式来支持更好的扩展性吧。你时不时会回头去《设计模式》，除了能够提供参考，此时你会有一些新的体会了。 第四阶段：手中无剑，心中有剑 你已经有设计和架构的概念了，这时你已经开始面对一个几万行甚至几十万行的项目，有一天你发现代码已经很难快速响应需求变化了，又没办法推倒重来（虽然推倒重来是码农最爱），所以来重构吧，重构的过程中，一个个设计模式把代码维护中的一个个痛点逐个击破，你对代码的“smell”有了更深刻的理解，你开始对copy-paste代码深恶痛绝，你发现原来重构和设计模式竟然是孪生兄弟。 你开始明白一个长期维护和演化的项目，设计如此之重要。你不自觉地就会主动去翻《重构》、《浮现式设计》、《领域驱动设计》、Bob大叔的《敏捷软件开发》、《企业应用架构模式》等等，虽然你之前可能看过，但此时你看他们的心境和底蕴已经不一样了，你会发现这帮家伙确实很会总结。 最终，你回本溯源，你还是拿起了当初那本《设计模式》，你终于深深地体会到了里面闪烁的智慧，“面向接口编程”，“组合优先继承”，多么朴素的文字，或许很多人都能说出来，但是你确定你现在的理解更加深刻了。 你会发现，此时你手中已经无剑了，你不会想着什么模式列表了，不会想着某个模式重要了。进行一个复杂设计时，不自觉地就从软件开发的终极目标“高内聚低耦合”出发，“面向接口编程”，“组合优先继承”，“创建与使用分离”等认知成为体液反应，结合需求场景，每定义下一个类都有“开放封闭”等各种面向对象设计原则护体，随着项目演进，你能敏锐地嗅到各种代码smell，知道如何考虑现有资源去减少该死的技术债，随时进行着重构。 有一天，你的小弟问你，怎么State模式和Strategy模式的类图是一样的？ 你装逼地笑了笑，说到：这些不重要，心中有剑就能无往不胜。