设计模式学习笔记之类图、对象之间的关系及设计模式概要

前言

设计模式最初是在上个世纪70年代在建筑领域提出来,一些建筑大师们在总结解决各种建筑问题时提出了上百种对应的解决模式。后来逐渐被引入到软件领域,起初并没有引起太大的关注,直到有4个人(Gong Of Four,业界称呼他们为“四人帮")合作出版了一本叫做《设计模式:可复用面向对象软件基础》的书,在业界产生了强烈的反响,从此以后设计模式被广泛地应用于软件领域。

设计模式在面试和实际开发中,尤其是架构设计中占据着很重要的地位,本系列文章是笔者系统学习设计模式的学习笔记,总结了设计模式的知识框架和知识要点,以便复习之用。本篇主要包含了如下内容:

一、类图的基本画法

1、类图中修饰符的基本表示


上面类图中左边的特殊符号所表示的含义为:

+:public
-: private
#: protected
~: default
下划线: static
斜体: abstract
  • 属性的完整表示方法:可见性 名称 :类型 [ = 缺省值 ]
  • 方法的完整表示方法:可见性 名称(参数列表) [ : 返回类型 ]

如果用java语言实现,那么上述类图对应的类结构如下:

 1 public abstract class Student {
 2     public String name = "Zhang San";
 3     private int score = 100;
 4     protected String id;
 5     String address;
 6     public static String sex = "";
 7 
 8     public void setName(String name) {
 9 
10     }
11 
12     protected String getId() {
13         return "";
14     }
15 
16     public abstract void jump();
17 }

2、类与类之间常见的关系

类与类之间的关系,比较常见的有6种,其关联程由弱到强的顺序依次为:依赖关系 < 关联关系 < 聚合关系 < 组合关系 < 继承关系 < 实现关系,下面一一介绍这些关系。

(1)泛化关系(Generalization)

即继承关系,描述子类与父类之间的继承关系,是is-a的关系。其包括类对类的继承,接口对接口的继承,在java中使用 extends 关键字。

其表示方法为:实线 + 空心三角

泛化关系的类图表示示例:


(2)实现关系(Realization)

表示实现类与接口之间的实现关系,在java中使用 implements关键字,和泛化关系一样,也是is-a的关系。

其表示方法为:虚线 + 空心三角

实现关系的类图表示示例:

(3)关联关系(Association)

关联关系是类与类之间最常用的一种关系,是一种结构化的引用关系,用于表示一个类对象与另一个类对象之间有联系,在代码中通常将一个类的对象作为另一个类的成员变量来实现关联关系。关联关系根据关联的强弱程度,由弱到强的顺序可以分为一般关联关系、聚合关系、组合关系,可以统一表示为has-a关系。这里关联关系没有做特别说明,指的是一般关联关系。

其表示方法为:实线 + 箭头

,并可以在上面标注数量关系;

一般关联关系又有四种情况:1)双向关联;2)单向关联;3)自关联;4)多重数关联。

1)双向关联

丈夫和妻子的关系就是相互的,丈夫拥有了妻子,那妻子就拥有了丈夫,在中国他们的关系只能是互相拥有一个。双向关系可以用双向箭头,也可以用没有箭头的直线表示。


image.png

2)单向关系

3)自关联

在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联,比如定义二叉树的节点。

4)多重数性关联

重数性关联关系又称为多重性关联关系(Multiplicity),表示一个类的对象与另一个类的对象连接的个数。在UML中多重性关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。

  • 1..1:仅一个
  • 0..*:零个或多个
  • 1..*:一个或多个
  • 0..1:没有或只有一个
  • m..n:最少m、最多n个 (m<=n)

(4)聚合关系(Aggregation)

描述一种较弱的整体与部分关系,整体与部分之间可以分割,部分脱离整体后可以独立存在,比如鱼与鱼群的关系,鱼离开了鱼群也可以单独存在,是一种own-a的关系,整体与部分可以存在1对多的关系。

其表示方法为:空心菱形 + 实线


,菱形端指向整体。

组合关系的类图表示示例:

(5)组合关系(Composition)

描述一种较强的整体与部分关系,整体与部分之间不可以分割,部分脱离整体后不可以独立存在,比如翅膀与鸟的关系,翅膀不可以脱离鸟而单独存在,是一种is-a-part-of关系,整体与部分可以存在1对多的关系。

其表示方法为:实心菱形 + 实线

,菱形端指向整体。

组合关系的类图表示示例:

(6)依赖关系(Dependency)

依赖关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。
其表示方法为:虚线 + 箭头

箭头从使用类指向被依赖的类。

依赖关系的类图表示示例:

为了方便记忆这6个关系,这里做一个简单对对比和归纳:

二、设计模式的七个原则

设计模式的设计包含了如下七个原则(有的资料说是六种,这里咱们以七种为准):

1、开闭原则:

Open Close Principle,意思是对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。

2、依赖倒转原则

Dependency Inversion Principle,是开闭原则的基础,具体内容为:面向接口编程,依赖抽象而不依赖具体。

3、单一职能原则

Single Responsibility Principle,意思是,就一个类而言,应该只包含一个职责,增强内聚性,降低耦合度。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。

4、接口隔离原则

Interface Segregation Principle,意思是,使用多个相互隔离的接口,比使用单个接口好。其作用为降低类与类之间的耦合度。

5、迪米特原则

Demeter Principle,也叫最少知道原则,它表示实体与实体之间应该尽量减少交互,保持模块与模块之间相互独立。

6、里氏代换原则

Liskov Substitution Principle,其含义是,任何基类可以出现的地方,子类也一定可以出现。只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。

7、合成复用原则

Composition Reuse Principle,尽量使用合成/聚合的方式,而不是使用继承。

三、设计模式中不可不知的面向对象知识要点

1、抽象类与接口的异同点

接口(Interface)与抽象类(Abstract Class)的区别

2、多态(重写与重载)

Java多态

Java重写(Override)与重载(Overload)

四、23种设计模式及它们之间的关系

下图来源于Gof的《设计模式 - 可复用面向对象软件基础》,列举了这23种设计模式以及它们之间的关系(这个图我没怎么看懂,留在这里经常来观摩观摩)。

五、设计模式的分类

《设计模式 - 可复用面向对象软件基础》将这23种设计模式分为三个大类:创建型模式、结构型模式、行为型模式。每个大类的关注点和所包含的设计模式类型如下图所示:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容