设计模式学习笔记(一)
参考资料
《Head First 设计模式》
概念
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括 架构模式、分析模式和过程模式等,实际上,在软件生存期的每一 个阶段都存在着一些被认同的模式。
学习设计模式的必要性
- 模式能够使用更少的词汇做更充分的沟通。模式词汇不止是词汇名称,而是一整套模式背后所象征的质量、特征、约束
- 使用模式谈论软件系统,可以让你保持在设计层次,不会被压倒到对象与类这类琐碎的事情上面
- 团队了解设计模式,彼此之间对设计的看法不容易产生误解。学习设计模式,可以帮助新人向有经验的开发人员看齐
- 设计模式的核心原则是为了应对变化点
如何使用设计模式
-
我们都使用别人设计好的库和框架编写程序。编写 Java 程序时,我们只需要了解 Java API 及它所带来的功能,从库和框架中挑选所要的组建,把它们放进合适的地方。但是,库与框架无法帮助我们将应用组织成容易了解、容易维护、具有弹性的构架,所以需要设计模式。
-
许多库和框架本身会用到设计模式,了解了设计模式,会更容易了解这些 API 是围绕这设计模式构造的
学习设计模式需要达到的三个层次
- 能在白纸上画出所有的模式结构和时序图
- 能用代码实现;如果模式的代码都没有实现过,是用不出来的;即所谓,看得懂,不会用
- 灵活应用到工作中的项目中
UML 类图
UML 类图提供机制,以代表类的成员,如属性和方法,对他们的其他信息。
指定一个类成员(即任何属性或方法)的可见性有下列符号,必须摆在各成员的名字之前:
符号 | 可见性 |
---|---|
+ | 公有 |
- | 私有 |
# | 保护(即对子类可见) |
~ | 包(即对包内其他成员可见) |
/ | 推导(即由其他属性推导得出,不需要直接给定其值) |
底线 | 静态成员 |
实例层级的关系
-
泛化关系 (Generalization)
- 即继承的反方向,指的是一个类(称为父类、父接口)具有另外的一个(或一些)类(称为子类、子接口)的共有功能。子类可视为其父类的特例,并可添加自己的新功能
- 用带空心三角形箭头的实线表示
- Java 中 extends 标识
-
实现(Realization)
- 指的是一个类实现接口(可以是多个)的功能
- 用带空心三角形箭头的虚线表示
- 在 Java 中通过关键字 implements 明确标识
-
依赖(Dependency)
- 可以简单的理解为一个类A使用到了另一个类B(use-a)。这种使用关系是具有偶然性、临时性的、非常弱的,但是B类的变化会影响到A
- 用带燕尾箭头的虚线表示
- 表现在代码层面,为类B作为参数被类A在某个method(方法)中使用
-
关联(Association)
- 某个对象长期的持有另一个对象的引用(has-a 关系);关联关系使一个类知道另外一个类的属性和方法
- 带燕尾箭头的实线表示
- 在代码层面上,被关联类以类属性的形式出现在关联类中,也可能是关联类引用了一个类型为被关联类的全局变量
-
聚合(Aggregate)
- 表示整体与部分的一类特殊的关联关系,是“弱”的包含(“owns a” )关系;,成分类可以不依靠聚合类而单独存在,可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享(sharable)。如图书馆包含学生和书籍
- 图形以空心的菱形箭尾与实线来表示
-
组成(Composition)
- 强的聚合关系( is a part of )。整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。例如公司与公司部门的关系
- 以实心的菱形箭尾与实线表示
类层级的关系
-
概括(Generalization)
- 指类与类之间的共通性
- 图形以实线和空心箭头来表示