设计模式(Design Pattern)的概念最早起源于建筑设计大师Alexander的《建筑的永恒方法》一书,尽管Alexander的著作是针对建筑领域的,但是他的观点实际上用用于所有的工程设计领域,其中也包括软件设计领域。在《建筑的永恒方法》一书中是这样描述模式的:

模式是一条由三个部分组成的通用规则:他表示一个特定环境、一类问题和一个解决方案之间的关系。每一个模式描述了一个不断重复发生的问题,以及该问题解决方案的核心设计。

软件领域的设计模式也有类似的定义:设计模式是对处于特定环境下,经常出现的某类软件开发的问题的一种相对成熟的设计方案。

所有资深软件设计师,他们积累了足够的经验,这些经验可以让他们快速、优雅地解决软件设计开发中的大量重复问题。而设计模式的最终目的就是帮助人们利用软件设计师的集成经验,从而设计出更加优秀的软件。

当然,写此文只是记录本人学习设计模式过程中的一点感悟,希望对读者有所帮助。实际上,设计模式的理解必须建立以足够的代码积累量作为基础。

根据Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides几个软件设计模式的奠基人的说法(他们的著作就是《Design Patterns:Elements of Reusable Object-Oriented Software》,中文名是《设计模式:可复用面向对象软件的基础》),设计模式常常被分成如下三类:

创建型模式 :创建对象时,不再由我们直接实例化对象,而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能、更好的架构优势。

  1. 抽象工厂模式(AbstractFactory)
  2. 工厂方法模式(FactoryMethod)
  3. 单例模式(Singleton)
  4. 创建者模式(Builder)
  5. 原型模式(Prototype)
   结构性模式:用于帮助将多个对象组织成更大的结构。
  1. 适配器模式(Adapter)
  2. 桥接模式(Bridge)
  3. 组合模式(Composite)
  4. 装饰模式(Decorator)
  5. 外观模式(Facade)
  6. 享元模式(Flyweight)
  7. 代理模式(Proxy)
   行为型模式:用于帮助系统间各对象的通信,以及如何控制复杂系统中的流程。
  1. 责任链模式(Chain of Responsibility)
  2. 命令模式(Command)
  3. 解释器模式(Interpreter)
  4. 迭代器模式(Iterator)
  5. 中介者模式(Mediator)
  6. 备忘录模式(Memento)
  7. 状态模式(State)
  8. 策略模式(Strategy)
  9. 模板方法模式(TemplateMethod)
  10. 观察者模式(Observer)
  11. 访问者模式(Visitor)

下面看一张本人用思维导图软件做的设计模式的总概况图:

说实话设计模式不是一般的难:

  • 第一难:需要你有真正的OO水平,有大量的编码及设计基础。
  • 第二难:难以在工作中真正实践全部23种设计模式,无实践就无法真正理解。很少系统需要用到设计模式,或者只用到很少的一部分。我们这些软件开发人员,大部分都是在做数据库的CRUD的工作,设计模式难有用武之地。
  • 第三难:学习资料要么太深奥难懂,要么就是太肤浅了。
  • 第四难:你以为你懂了,其实你没懂!设计模式学习过程是迂回前进的。
  • 第五难:找不到高手与你沟通!

设计模式绝对不是纸上谈兵的知识,关看书就以为自己懂了,那只是井底之蛙之见,设计模式绝对是从实践中来到实践中去的!

如果编码经验甚少,也不太可能能理解好设计模式,但凡软件设计能力强的人编码功底都是相当扎实的。

如果没有能深刻理解面向对象,也不太可能理解好设计模式。

按对设计模式的熟悉程度,我划分了一下几个档次:

  1. 不知道:没听说过,或者只知道名字。
  2. 能说:能简单说出该设计模式的用途。
  3. 能画:能准确地画出该设计模式的类图,或者画出实际应用的类图。
  4. 能写:能写出实现该设计模式的实例代码。
  5. 会用:能在实际工作中运用设计模式。
  6. 活用:很熟练,能在工作中创造性地应用设计模式,可以指导别人应用设计模式工作。

如何学习设计模式?
  1. 要用真正面向对象的语言来编程,这样会加速你对面向对象、设计模式的理解
  2. 找浅显的设计模式来学习:《Design Patterns:Elements of Reusable Object-Oriented Software》这本大作好是好,但是很难看得懂,《Head First 设计模式》容易入门,《研磨设计模式》也很不错。
  3. 在设计工作中多用类图:类图关看是远远不够的,要多多实践,通过类图来提高自身的OO能力。
  4. 多想具体的应用例子,并写出实例代码。
  5. 多提问,敢于挑战传统想法。

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================

我的设计模式学习笔记------>Java设计模式总概况的更多相关文章

  1. [置顶] 我的设计模式学习笔记------>Java设计模式总概况

    设计模式的概念最早起源于建筑设计大师Alexander的<建筑的永恒方法>一书,尽管Alexander的著作是针对建筑领域的,但是他的观点实际上用用于所有的工程设计领域,其中也包括软件设计 ...

  2. 设计模式学习笔记——java中常用的设计模式

    单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...

  3. Java设计模式学习笔记(一) 设计模式概述

    前言 大约在一年前学习过一段时间的设计模式,但是当时自己的学习方式比较低效,也没有深刻的去理解.运用所学的知识. 所以现在准备系统的再重新学习一遍,写一个关于设计模式的系列博客. 废话不多说,正文开始 ...

  4. Java23种设计模式学习笔记【目录总贴】

    创建型模式:关注对象的创建过程 1.单例​模式:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 主要: 饿汉式(线程安全,调用效率高,但是不能延时加载) 懒汉式(线程安全,调用效率不高,但 ...

  5. 23种设计模式+J2EE设计模式学习笔记-初识设计模式

    设计模式简介: 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结.(个人理解:设计模式是不关乎业务,逻辑实现,针对普遍问题的一种解决方案). 设计模式的类型: 传统23种设 ...

  6. Java设计模式学习笔记(五) 单例模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 使用单例模式的原因 以Windows任务管理器为例,在Windows系统中,任务管理器是唯 ...

  7. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...

  8. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  9. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

随机推荐

  1. Effective C++--经验条款

    高效C++ --模板与泛型编程 在C++中模板体现的是编译期多态,virtual体现的是执行期多态. 关于typename的双重含义: 在声明template參数时,不论使用keywordclass或 ...

  2. java中native方法的使用

    在非常多情况下,java须要调用其它语言的代码,比方c的代码.那么这个时候java中native方法就发挥作用了.以下就介绍native方法的使用. 一.JNI使用流程 a.编写带有native声明的 ...

  3. 去除inline-block元素间间距的N种方法-zhangxinxu

    张鑫旭原文:点这里进入原文 另外附上大漠老师的如何解决inline-block元素的空白间距地址!!! 去除inline-block元素间间距的N种方法: 一.现象描述 真正意义上的inline-bl ...

  4. javascript 在js文件中获取路径

    如果在*.js文件中获取当自己当前的路径是很重要的. 举个例子,如果一个css文件中引用图片,如background-img: url('./Images/bg.png').那么图片的路径,是相对于c ...

  5. LINQ使用与并行

    LINQ介绍 參考:https://msdn.microsoft.com/en-us/library/bb397906.aspx LINQ查询主要运行操作包含:1)获取数据源:2)创建查询:3)运行查 ...

  6. 编程算法 - 求1+2+...+n(构造函数) 代码(C++)

    求1+2+...+n(构造函数) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\whi ...

  7. POJ1195 Mobile phones 【二维线段树】

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14291   Accepted: 6644 De ...

  8. Google Code Jam 2014 Round 1 A:Problem C. Proper Shuffle

    Problem A permutation of size N is a sequence of N numbers, each between 0 and N-1, where each numbe ...

  9. IIS7设置默认页

    一般用ASP.NET创建的网站默认页都是Default.aspx,不需要设置. 但是如果有网站的起始页不是Default.aspx,就需要在IIS里设置了. IIS7的设置方法和IIS6的不一样: 在 ...

  10. NFS网络文件系统服务(配置实战)

    NFS网络文件系统服务(实战) NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.让不同的主机系统(NFS的客户端)可以透明地读写位 ...