在面向对象的学习过程中,设计模式是一项很重要的学习内容,那么什么是设计模式呢?
“设计模式描述了在我们周围不断重复发生的问题,以及解决该问题的核心。”一位建筑师 Christopher Alexander 这么说道。
在软件设计中,设计模式描述了一类常见问题的一般性解决方案。经典书籍《设计模式:可复用面向对象软件的基础》中描述了23种核心的设计模式,创立了模式在软件设计中的地位。
面向对象设计模式是“好的面向对象设计”,即可以满足“应对变化,提高用的设计”。设计模式是经验性的总结和归纳,不能生搬硬套,需要结合具体的项目,细致的分析需求的变化点,针对相应的变化点来选择相应的一个或者多个设计模式来解决问题。如果要学好面向对象设计模式,需要扎实的面向对象的知识。
在各种面向对象的编程语言中,语言机制各有差别,但是都具有面向的三大特征:封装(隐藏内部实现),继承(复用现有代码),多态(改写对象行为)。面向对象语言只是为了让使用者更方便的使用面向对象的机制,不能说学会了一门面向对象的语言(C#、java)就说自己学会了面向对象。所以我们需要单独的学习面向对象的概念,并理解面向对象的设计原则。
下面是一些重要的面向对象的原则:
1. 针对接口编程,而不是针对实现编程。客户只需要知道他能够做些什么事情以及做这些事情的效果,而无需知道怎么去做这些事情。
2. 优先使用对象,而不是类的继承。继承在某种程度上破坏了封装的原则,子类和父类之间的耦合性太高。
3. 封装变化点。使用封装来创建对象之间的分界层,设计者可以在分界层的一侧进行修改,而不会对另一个产生影响。
上述三条是设计模式中比较核心的设计原则,除了这些还有一下比较具体的原则:
单一职责原则(SRP):一个类应该仅有一个引起它变化的原因。
开放封闭原则(OCP):对扩展开发,对修改关闭。
Liskov替换原则(LSP):子类必须能够替换他们的基类。
倚赖倒置原则(DIP):高层模块不应该倚赖底层模块,二者都应该倚赖于抽象。抽象不应该倚赖于实现细节,实现细节应该倚赖于抽象。
接口隔离原则(ISP):不应该强迫客户程序倚赖于它不同的用法。
在敏捷软件开发中,提出了“使用重构得到模式”是目前公认的最好使用设计模式的方法。
在经典著作《设计模式:可复用面向对象软件的基础》中,四位作者将设计模式划分为三组:
目的 | 设计模式 | 可变的方面 |
创建 | 抽象工厂(Abstract Factory) 生成器(Builder) 工厂方法(Factory Method) 原型(Prototype) 单件(Singleton) |
产品对象家族 如何创建一个组合对象 被实例化的子类 被实例化的类 一个类的唯一实例 |
结构型 | 适配器(Adapter) 桥接(Bridge) 组成(Composite) 装饰(Decorator) 外观(Facade) 亨元(Flyweight) |
对象的接口 对象的实现 一个对象的结构和组成 对象的职责,不生成子类 对象的存储开销 如何访问一个对象,该对象的位置 |
行为模式 | 职责链(chain of responsibility)
命令(command) 解释器(interpreter) 迭代器(iterator) 中介者(mediator) 备忘录(memento) 观察者(observer) 状态(state) 策略(strategy) 模版方法(template method) 访问者(visitor) |
满足一个请求的对象 何时、怎样满足一个请求 一个语言的文法及解释 如何遍历、访问一个聚合的各元素 对象间怎样交互,和谁交互 一个对象中哪些私有信息存放在该对象之外,以及在什么时候进行存储 多个对象依赖于另外一个对象,而这些对象又如何保持一致 对象的状态 算法 算法中的某些步骤 某些可作用于一个(组)对象上的操作,但不修改这些对象的类 |
原文:http://www.cnblogs.com/hanzejl/p/3589551.html