1 什么是设计模式(Design Pattern)?
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验总结,它是在特定场景下,针对某类问题的通用解决方案,代表了最佳实践
2 使用设计模式的目的
- 可重用代码
- 让代码更容易被他人理解
- 保证代码的可靠性
3 设计模式的由来
GOF四人帮合著的《设计模式——可复用的面向对象软件设计元素》
主要基于的面向对象设计原则:
- 对接口编程而非对实现编程
- 优先使用对象组合而非继承
4 设计模式的两个主要用途
-
开发人员的共同平台
-
最佳的实践
5 设计模式的分类
5.1 创建型模式
含义
实例化对象的模式,提供了一种在创建对象时隐藏创建逻辑的方式,而非直接用new实例化对象,将对象的创建过程从使用者中解耦出来
举例
-
简单工厂:依据传入的参数决定生产哪种对象产品
-
单例模式:采用单例模式设计的类只有一个单例,并提供一个全局访问点
-
原型模式:通过复制现有的实例来创建新的实例
扫描二维码关注公众号,回复: 10454717 查看本文章
5.2 结构型模式
含义
通过结合多个类或对象形成更大的结构,关注类和对象的组合
举例
-
组合模式:将对象组合成树形结构
-
装饰器模式:动态的给对象添加新的功能
-
代理模式:为对象创建一个代理以便控制对这个对象的访问,典型的例子是java动态代理中的Proxy类
5.3 行为型模式
含义
关注对象之间的通信交互和操作策略等行为
举例
-
责任链模式:将请求的发送者和接收者解耦,使一个请求能被多个对象处理,典型的例子是tomcat的Container容器处理请求的过程(请求被依次传递给Server对象、Host对象、Context对象以及Wrapper对象处理)
-
迭代器模式:一种遍历访问聚合对象内部元素的方法,不暴露聚合对象的内部结构,典型的例子就是C++和java中的迭代器
-
策略模式:定义一系列算法(操作策略),将它们封装起来,并可使其相互替换
5.4 J2EE模式
含义
特别关注表示层,由Sun公司主导
举例
-
MVC模式
-
前端控制器模式
-
数据访问对象(DAO)模式
6 设计模式的六大原则
6.1 开闭原则
对扩展开放,对修改关闭。目的是为了使软件易于扩展和维护。
6.2 里氏代换(Liskov Substitution)原则
凡是基类出现的地方,都可以用派生类去代替,该原则是继承复用的基石,也是对开闭原则的补充。实现开闭原则的关键是抽象化,派生类和基类的继承关系是抽象化的具体实现,LS原则正是对继承关系的规范
6.3 依赖倒转(Dependence Inversion)原则
针对接口编程,依赖于抽象而非具体,是开闭原则的基础。(名字的理解:抽象是依赖于具体,但要反过来依赖抽象编程才能具有良好的扩展性)
6.4 接口隔离(Interface Segregation)原则
两层含义:
- 使用多个隔离的接口比使用单个接口要好
- 降低类之间的耦合度
体现的思想:降低依赖,降低耦合
6.5 最少知道原则
一个实体应当尽量少地与其他实体之间发生相互作用,使得系统的各功能模块之间相对独立,还是为了降低耦合,便于扩展维护
6.6 合成复用(Composite Reuse)原则
尽量使用合成/聚合的方式,而不是使用继承来实现复用,原因还是在于使用合成/聚合的复用方式更灵活,类之间的耦合度更低;而继承复用会破坏系统的封装性(基类会将实现细节暴露给子类)。
一般而言,如果两个类之间是“Has-A”的关系应使用组合或聚合,如果是“Is-A”关系可使用继承。“Is-A"是严格的分类学意义上的定义,意思是一个类是另一个类的"一种”;而"Has-A"则不同,它表示某一个角色具有某一项责任。
聚合与合成的区别
- 聚合(aggregation):表示一种“拥有”关系,部分聚合成整体且部分的生命周期可以大于整体,如班级和学生构成的聚合关系。
- 合成(Composition):表示一种更强的“拥有”关系,部分与总体的生命周期是一致的,如房子和房间的关系
参考: