【设计模式】设计模式学习笔记之(一)——类图、对象之间的关系及设计模式概要

前言

        设计模式最初是在上个世纪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)双向关联

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

      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种设计模式分为三个大类:创建型模式、结构型模式、行为型模式。每个大类的关注点和所包含的设计模式类型如下图所示:

书中的原文如下:

 

posted @ 2021-08-13 10:30  宋者为王  阅读(929)  评论(2编辑  收藏  举报