设计模式开篇 -凯发k8官方网
- 设计模式(design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
- 设计模式是软件开发人员在软件开发过程中面临的一般问题的凯发k8官方网的解决方案。这些凯发k8官方网的解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
- 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
- 设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
- 项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心凯发k8官方网的解决方案。
- 在 1994 年,由 erich gamma、richard helm、ralph johnson 和 john vlissides 四人合著出版了一本名为 design patterns - elements of reusable object-oriented software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
图书链接:https://book.douban.com/subject/1052241/
-
四位作者合称 gof(四人帮,全拼 gang of four)。
-
他们所提出的设计模式主要是基于以下的面向对象设计原则:
-
- 对接口编程而不是对实现编程。
- 优先使用对象组合而不是继承。
-
根据设计模式的参考书 design patterns - elements of reusable object-oriented software(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。
-
这些模式可以分为三大类:
-
- 创建型模式(creational patterns)
- 结构型模式(structural patterns)
- 行为型模式(behavioral patterns)
- 还有另一类设计模式:j2ee 设计模式。
1 | 创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 | 工厂模式(factory pattern)抽象工厂模式(abstract factory pattern)单例模式(singleton pattern)建造者模式(builder pattern)原型模式(prototype pattern) |
2 | 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 | 适配器模式(adapter pattern)桥接模式(bridge pattern)过滤器模式(filter、criteria pattern)组合模式(composite pattern)装饰器模式(decorator pattern)外观模式(facade pattern)享元模式(flyweight pattern)代理模式(proxy pattern) |
3 | 行为型模式 这些设计模式特别关注对象之间的通信,负责对象间的高效沟通和职责委派。 | 责任链模式(chain of responsibility pattern)命令模式(command pattern)解释器模式(interpreter pattern)迭代器模式(iterator pattern)中介者模式(mediator pattern)备忘录模式(memento pattern)观察者模式(observer pattern)状态模式(state pattern)空对象模式(null object pattern)策略模式(strategy pattern)模板模式(template pattern)访问者模式(visitor pattern) |
4 | j2ee 模式 这些设计模式特别关注表示层。这些模式是由 sun java center 鉴定的。 | mvc 模式(mvc pattern)业务代表模式(business delegate pattern)组合实体模式(composite entity pattern)数据访问对象模式(data access object pattern)前端控制器模式(front controller pattern)拦截过滤器模式(intercepting filter pattern)服务定位器模式(service locator pattern)传输对象模式(transfer object pattern) |
5.1 六大原则
1、开闭原则(open close principle)
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。
2、里氏代换原则(liskov substitution principle)
里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。lsp 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(dependence inversion principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(interface segregation principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。
5、迪米特法则,又称最少知道原则(demeter principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(composite reuse principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
5.2 核心思想
在类之间, 最常见的关系有:
6.1 泛化/继承
- 含义:继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。
- 代码体现:在java中继承关系通过关键字extends明确标识
- 箭头指向:继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。
6.2 实现
- 含义:实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。
- 代码体现:在java中此类关系通过关键字implements明确标识
- 箭头指向:实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。
6.3 依赖
- 含义:一种使用的关系,即一个类的实现需要另一个类的协助,要尽量不使用双向的互相依赖.
这种使用关系是具有偶然性的、临时性的、非常弱的,类b的变化会影响到类a。 - 代码表现:局部变量、方法的参数或者对静态方法的调用;类b作为方法参数(局部变量)被类a在某个method方法中使用
- 箭头指向:用带箭头的虚线表示,指向被使用者
6.4 关联
- 含义:是一种拥有的关系,它使一个类知道另一个类的属性和方法;
这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。 - 代码体现:成员变量。被关联类b以类的属性形式出现在关联类a中,也可能是关联类a引用了一个类型为被关联类b的全局变量。
- 箭头指向: 带普通箭头的实心线,指向被拥有者
6.5 聚合
- 含义:聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。
此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。
比如计算机与cpu、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。 - 代码体现:成员变量;和关联关系是一致的,只能从语义级别来区分
- 箭头指向:带空心菱形的实心线,菱形指向整体
6.6 组合
- 含义:组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,
比如人和人的大脑。比如公司和部门是整体和部分的关系,没有公司就不存在部门。 - 代码体现:成员变量;和关联关系是一致的,只能从语义级别来区分
- 箭头指向:带实心菱形的实线,菱形指向整体
6.7 强弱顺序
各种关系的强弱顺序:泛化/继承 = 实现 > 组合 > 聚合 > 关联 > 依赖
6.8 一张图融会贯通
下面这张uml图,比较形象地展示了各种类图关系:
总结
- 上一篇: 会话管理:session与cookie
- 下一篇: 工厂与抽象工厂