1 设计模式介绍
-
设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式代表例最佳实践,这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的
-
设计模式的本质是提高软件的维护性,通用性和扩展性,并降低软件的复杂度
-
《设计模式》是经典的书,作者是Erich Gamma, Richard Helm , Ralph Johnson 和 JohnVlissides(俗称四人组GOF)
-
设计模式并不局限于某种语言, java,php,c++都有设计模式
2 设计模式的七大原则
- 单一职责原则
- 应该有且只有一个原因引起类的变更
- 对于单一职责原则,接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。
- 里氏替换原则
只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道父类还是子类,但是,反过来就不行,有子类出现的地方,父类未必就能适应,采用里氏替换原则时,尽量避免子类的个性,一旦子类有个性,这个子类和父类之间的关系就很难调和类,把子类当作父类使用,则子类必须完全实现父类的方法
-
子类可以有自己的个性
-
覆盖或者实现父类的方法时输入参数可以被放大
-
覆写或实现父类的方法时输出结果可以被缩小
- 依赖倒置原则
-
高层模块不应该依赖于低层模块,两者都应该依赖其抽象;抽象不应该依赖于细节,细节应该依赖抽象
-
面向接口编程,而不是面向实现类
- 接口隔离原则
-
一个类对另一个类对依赖应该建立在最小的接口上
-
各个类建立自己的专用接口,而不是万能接口
- 迪米特法则
-
最少知道原则
-
无需交互的两个类,如果需要交互,使用中间者
过度使用迪米特原则,会使系统产生过多的中介类,从而增加系统的复杂性,使模块之间的通信效率降低
-
开闭原则
当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化
-
合成复用原则
-
软件复用时,要尽量先使用组合或者聚合等关联方式来实现,其次在考虑使用继承关系来实现
-
优先组合,其次继承
3 设计模式种类
组件的生命周期
按照组件的生命周期来进行划分,设计模式可以分为三种类型的设计模式
3.1 创建型模式
创建型模式关注点在于“怎样创建出对象”
-
将对象的创建与使用分离
-
降低耦合度
-
使用者无需关注对象的创建细节
-
各种工厂模式:对象的创建由相关的工厂来完成
-
建造者模式:对象的创建由一个建造者来完成
-
原型模式:对象的创建由原先的对象克隆完成
-
单例模式:对象在系统中始终有一个实例
-
3.2 结构型模式
结构型模式关注点在于怎么组合对象/类
-
关心类的组合,由多个类可以组合成一个更大的(继承)
-
关心类与对象的组合,通过关联关系在一个类中定义另一个类的实例对象(组合)
-
根据合成复用原则,在系统中尽量使用关联关系来替代继承关系,因此大部分的结构型模式都是对象结构型模式
-
适配器模式:两个不兼容接口之间适配的桥梁
-
桥接模式:相同功能抽象化与实现化解耦,抽象与实现可以独立升级
-
过滤器模式:使用不同的标准来过滤一组对象
-
组合模式:相似对象进行组合,形成树形结构
-
装饰器模式:向一个现有的对象添加新的功能,同时又不改变其结构
-
外观模式:向现有的一个系统添加一个接口,客户端访问此接口来隐藏此系统的复杂型
-
享元模式:尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象
-
代理模式:一个类代表另一个类的功能
-
3.3 行为型模式
行为型模式关注点在于怎么运行对象/类;关注类/对象运行时流程控制
-
描述程序在运行时复杂的流程控制
-
描述多个类或对象之间怎么互相协作共同完成某个对象都无法单独完成的任务,涉及算法与对象间职责的分配。
-
行为型模式分为类行为模式和对象行为模式,前者采用继承机制在类间分配行为,后者采用组合或者聚合在对象间分配行为。由于组合关系或聚合关系比继承关系偶合低,满足合成复用原则,所以对象行为模式比类行为模式具有更大灵活性
-
模版方法: 父类定于算法骨架,某些实现放在子类
-
策略模式:每种算法独立封装,根据不同情况使用不用的算法策略
-
状态模式: 每种状态独立封装,不同状态内部封装类不同行为
-
命令模式: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开
-
职责链模式:所有处理者封装为链式结构,依次调用
-
备忘录模式: 将核心信息抽取出来,可以进行保存
-
解释器模式: 定义语法解析规则
-
观察者模式: 维护多个观察者依赖,状态变化通知所有的观察者
-
中介者模式: 取消类/对象的直接调用关系,使用中介者维护
-
迭代器模式: 定义集合数据的遍历规则
-
访问者模式:分离对象结构,与元素的执行算法
-
除了模版方法模式和解释器模式是类行为型模式,其他的全部属于对象行为型模式