最近正在学习设计模式部分的知识,看了很多大牛整理好的博文和一些视频讲解。在博文和视频中各位老师举的例子都特别形象,本想转载一下了事,但知识的东西毕竟还是通过自己写出来才能理解的更透彻,也可顺便作为自己的学习总结,同时帮助自己记录下还有哪些设计模式还没有学到,已经学过的设计模式是否还没有学透。所以准备以博客形式记录下来,如果在某一点上能帮助到几名想要学习设计模式的同学那就是最好的了。 话不多说,言归正传,开始我们的设计模式的征程!!
在前言部分需要先了解以下几个问题:
- 什么是设计模式
- 设计模式的设计原则
- 设计模式分类与功能介绍
1.什么是设计模式
官方定义如下:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
说白了就是老前辈们在各个项目中总结出来的一套经验方法,一种思维模式,并已经反复被使用,这些方法巧妙的解决了很多困难的问题,针对不同的情况会有相应的处理办法。
这些方法被GOF("*")总结了出来,共23种经典的设计模式。如果灵活正确的使用设计模式可以提高软件整体的可复用性和可扩展性,达到“高内聚、低耦合”目的,为可复用软件设计奠定了一定的理论基础。
2.设计模式的设计原则
说到设计原则就不得不说面向对象的6大设计原则。具体原则简述如下:
- 单一职责原则:
- 即一个类只负责一个职责,只把一件事情做好,其他事情不管。
- 里氏替换原则:
- 当需要一个父类对象的时候,可以用一个子类对象来特换。
- 当需要一个子类对象,给一个父类对象是不行的
- 把子类类型赋值给父类类型,发生了隐式转换
- 把父类类型赋值给子类类型,需要显示转换(强制转换),前提是父类所指对象确实是显示转换的子类类型,如果不是则转换失败。
- 为了避免显示类型转换失败,可以先进行类型判断 如: if(对象 is 类) ( 对象 as 类)如果失败 返回null
- 依赖倒置原则:
- 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
- 抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成
- 依赖倒置原则的核心就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置。
- 底层模块尽量都有抽象类或接口,或者两者都有个。
- 变量声明类型尽量都是 抽象类或接口
- 使用继承时遵循里氏替换原则
- 接口隔离原则:
- 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
- 即:如果一个接口功能特别多,需要将功能进行拆分,分解为多个小接口,类只集成自己需要的接口。
- 迪米特法则:
- 定义:一个对象应该对其他对象保持最少的了解。
- 目的:达到模块之间的低耦合
- 方法:只与直接的朋友通信。我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。陌生的类最好不要作为局部变量的形式出现在类的内部。
- 开闭原则:
- 程序写好后如果要扩展功能是允许的,但是禁止修改源代码,对修改封闭。即:功能扩展开放
- 利用多态功能就可解决
该部分内容主要引自: http://www.uml.org.cn/sjms/201211023.asp
扩展阅读:“如何向妻子解释OOD”是一篇非常有意思的文章。
3.设计模式分类与功能介绍
设计模式可以分为三大类:
创建型模式:共5种:工厂方法模式,抽象工厂模式,单列模式,建造者模式,原型模式
结构型模式:共7种:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式
行为型模式:共11种:策略模式,模板方法模式,观察者模式,迭代子类模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式
补充另外2种模式:并发型模式和线程池模式
各个模式功能介绍:
创建型模式:共5种
- 单列模式:这一模式的目的是使得类的一个对象成为系统中的唯一实例。
- 工厂模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
- 抽象工厂模式:提供一个创建一个系列相关或相互依赖对象的接口,无需制定它们具体的类。如:元旦系类与圣诞系列功能,可以通过选择来创建不同系列的产品。
- 创造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
- 原型模式:是用于创建重复的对象,同时又能保证性能。当直接创建对象的代价比较大时,则采用这种模式。
结构型模式:共7种
- 适配器模式:是作为两个不兼容的接口之间的桥梁。
- 装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构。
- 代理模式:一个类代表另一个类的功能。我们创建具有现有对象的对象,以便向外界提供功能接口。
- 外观模式:隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用
- 桥接模式:用于把抽象化与实现化解耦,使得二者可以独立变。
- 组合模式:又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。处理部分-整体场景问题,如树形菜单,文件、文件夹的管理。
- 享元模式:主要用于减少创建对象的数量,以减少内存占用和提高性能。
行为型模式:共11种
- 策略模式:一个类的行为或其算法可以在运行时更改。
- 模板方法模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
- 观察者模式:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象
- 迭代子类模式:用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
- 责任链模式:为请求创建了一个接收者对象的链。通常每个接收者都包含对另一个接收者的引用。如果一
- 命令模式:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令
- 备忘录模式:保存一个对象的某个状态,以便在适当的时候恢复对象。
- 状态模式:类的行为是基于它的状态改变的。我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象
- 访问者模式:我们使用了一个访问者类,它改变了元素类的执行算法。
- 中介者模式:是用来降低多个对象和类之间的通信复杂性。
- 解释器模式:提供了评估语言的语法或表达式的方式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎
该部分内容参考:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html
http://www.runoob.com/design-pattern/design-pattern-tutorial.html