设计模式总纲

Posted xxwang1018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式总纲相关的知识,希望对你有一定的参考价值。

[toc]

一、UML

在一个现代化的工程中,人们要相互沟通和合作,就必须使 用标准的工业化设计语言对待开发的产品进行建模

建模过程把复杂的问题分解成为易于理解的小问题,以达到问题的求解;其目的是把所要设计的结构和系统的行为联系起来,并对系统的结构进行可视化控制

1.1 UML的结构

1、视图

  • 用户视图:以用户的观点表示系统的目标,是所有视图的核心,该视图描述系统的需求
  • 结构视图:表示系统的静态行为,描述系统的静态元素,如包、类与对象,以及它们之间的关系
  • 行为视图:表示系统的动态行为,描述系统的组成元素,如对象在系统运行时的 交互关系
  • 实现视图:表示系统中逻辑元素的分布,描述系统中物理文件以及它们之间的关系
  • 环境视图:表示系统中物理元素的分布,描述系统中硬件设备以及它们之间的关系

2、图

  • 用例图:对应用户视图。用例图通过用例来表示系统的功能需求。用例图用于表示多个外部执行者与系统用例之间以及用例与用例之间的关系。用例图与用例说明文档是常用的需求建模工具
  • 类图:对应结构视图。类图使用类描述系统的静态结构。类图包含类和它们之间的关系,它描述系统内所声明的类,但它没有描述系统运行时类的行为
  • 对象图:对应结构视图。对象图是类图在某一时刻的一个实例,用于表示类的对象之间的关系
  • 状态图:对应行为视图。状态图描述一个特定对象的所有可能状态及其引起状态转移的事件。一个状态图包括一系列对象的状态及状态之间的转换
  • 活动图:对应行为视图。活动图表示系统中各种活动的次序,其应用非常广泛,既可用来描述用例的工作流程,也可以用来描述类中某个方法的操作行为
  • 序列图:又称时序图,对应行为视图。顺序图表示对象之间的交互,重点表示对象之间发送消息的时间顺序
  • 协作图:对应行为视图。协作图展示了一组对象、这些对象间的连接以及它们之间收发的消息它与序列图是同构图,包含了相同的信息,只是表达方式不同而已,协作图与序列图可以相互转换
  • 构件图:对应实现视图。构件图描述每个功能所在的组件位置以及它 们之间的关系
  • 部署图:对应于环境视图。部署图描述软件中各个组件驻留的硬件位置以及这些硬件之间的交互关系

3、模型元素

在 UML中,模型元素包括事物以及事物与事物之间的联系

事物是 UML的重要组成部分,它代表任何可以定义的东西。事物之间的关系把事物联系在一起,组成有意义的结构模型。每一个模型元素都有一个与之相对应的图形元素

1.2类图

1、类与类图

封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称

在系统中,每个类具有一定的职责,即类要完成什么样的功能。一个类可以有多种职责,设计得好的类一般只有 一种职责

定义类的时候,将类的职责分解成为类的属性和操作(即方法)。类的属性即类的数据职责,类的操作即类的行为职责

UML类图中,类一般由三部分组成

  • 类名:每个类都必须有一个名字,类名是一个字符串
  • 属性:指类的性质,即类的成员变量。类可以有任意多个属性,也可以没有属性。可见性 名称:类型 [= 默认值]
  • 操作:操作是类的任意一个实例对象都可以使用 的行为,操作是类的成员方法

2、类之间的关系

(1)关联关系

关联关系是类与类之间最常用的一种关系,用于表示一类对象与另一类对象之间的联系

在 UML类图中,用实线连接有关联的对象所对应的类

在使用类图表示关联关系时可以在关联线上标注角色名

public class LoginForm {
	private JButton loginButton;
	……
}
public class JButton {
	……
}
  • 双向关联:默认情况下,关联是双向的

    public class Customer {
        private Product[] products;
        ……
    }
    public class Product {
        private Customer customer;
        ……
    }
    
  • 单向关联:用带箭头的实线表示

    public class Customer {
        private Address address;
        ……
    }
    public class Address {
        ……
    }
    
  • 自关联:一些类的属性对象类型为该类本身

    public class Node {
        private Node subNode;
        ……
    }
    
  • 重数性关联:表示 一个类的对象与另一个类的对象连接的个数

    public class Form {
        private Button buttons[];
        ……
    }
    public class Button {
        …
    }
    
表示方式 多重性说明
1..1 表示另一个类的一个对象只与一个该类对象有关系
0..* 表示另一个类的一个对象与零个或多个该类对象有关系
1..* 表示另一个类的一个对象与一个或多个该类对象有关系
0..1 表示另一个类的一个对象没有或只与一个该类对象有关系
m..n 表示另一个类的一个对象与最少m、最多n个该类对象有关系 (m<=n)

(2)聚合关系

聚合关系表示整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构,从而找出一些成员类,该整体类和成员类之间就形成了聚合关系

在聚合关系中,成员类是整体类的一部分,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立 存在

UML中,聚合关系用带空心菱形的直线表示

public class Car {
    private Engine engine;
    
    public Car(Engine engine) {
        this.engine = engine;
    }
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
    
    ……
}
public class Engine {
    ……
}

(3)组合关系

组合关系也表示类之间整体和部分的关系, 但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在

在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类

UML中,组合关系用带实心菱形的直线表示

public class Head {
    private Mouth mouth;
    
    public Head() {
        mouth = new Mouth();
    }
    
    ……
}
public class Mouth {
    ……
}

(4)依赖关系

依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系

大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数

UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方

public class Driver {
    public void drive(Car car) {
        car.move();
    }
    
    ……
}
public class Car {
    public void move() {
        ……
    }
    
    ……
}

(5)泛化关系

泛化关系即继承关系

泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派 生类

UML中,泛化关系用带空心三角形的直线表示

public class Person {
    protected String name;
    protected int age;
    
    public void move() {
        ……
    }
    public void say() {
        ……
    }
}
public class Student extends Person {
    private String studentNo;
    
    public void study() {
        ……
    }
}

(6)接口与实现关系

接口之间也可以有与类之间关系类似的继承关系和依赖关系,但是接口和类之间还存在一种实现关系,在这种关系中,类实现了接口,类中的操作实现了接口中所声明的操作

UML 中,类与接口之间的实现关系用带空心三角形的虚线来表示

public interface Vehicle  {
    public void move();
}
public class Ship implements Vehicle {
    public void move() {
        ……
    }
}
public class Car implements Vehicle {
    public void move() {
        ……
    }
}

举例

某基于Java语言的C/S软件需要提供注册功能,该功能简要描述如下:

用户通过注册界面(RegisterForm)输入个人信息,用户点击“注册”按钮后将输入的信息通过一个封装用户输入数据的对象(UserDTO)传递给操作数据库的数据访问类(DAO),为了提高系统的扩展性,针对不同的数据库可能需要提供不同的数据访问类,因此提供了数据访问类接口,如 IUserDAO,每一个具体数据访问类都是某一个数据访问类接口的实现类,如 OracleUserDAO就是一个专门用于访问Oracle数据库的数据访问类

根据以上描述绘制类图。为了简化类图,个人信息仅包括账号(userAccount)和密码(userPassword),且界面类无须涉及界面细节元素

技术图片

1.3序列图

用于表示对象之间的动态交互,而且以图形化的方式描述了对象间消息传递的时间顺序

1、定义

序列图是一种强调对象间消息传递次序的交互图,又称时序图。它以图形化的方式描述了在一个用例或操作的执行过程中对象如何通过消息相互交互,说明了消息如何在对象之间被发送和接收以及发送的顺序

序列图通常有两种

  • 需求分析阶段的序列图:主要用于描述用例中对象之间的交互,可以使用自然语言绘制,用于细化需求,它从业务的角度进行建模,用描述性的文字叙述消息的内容
  • 系统设计阶段的序列图:确切表示系统设计中对象之间的交互,考虑到具体的系统实现,对象之间通过方法调用传递消息

2、序列图组成元素与绘制

UML中,序列图将交互关系表示为一个二维图,纵向轴表示时间轴,时间沿竖线向下延伸;横向轴表示在交互过程中的独立对象,对象的活动用生命线表示。序列图由执行者、生命线、 对象、激活框和消息等元素组成

执行者是交互的发起人,使用与用例图一样的“小人”符号表示,有些交互过程无须使用执行者

生命线用一条纵向虚线表示

对象表示为一个矩形,其中对象名称标有下划线

激活是过程的执行,包括等待过程执行的时间。在序列图中激活部分替换生命线,使用长条的矩形表示

消息是对象之间的通信,是两个对象之间的单路通信,是从发送者到接收者之间的控制信息流。消息在序列图中由有标记的箭头表示,箭头从一个对象的生命线指向另一个对象的生命线,消息按时间顺序在图中从上到下排列

一个复杂的序列图可以划分为几个小块,每一个小块称为一个交互片段。每个交互片段由一个大方框包围,在方框左上角的间隔区内标注该交互片段的操作类型,该操作类型用操作符表示,常用的操作符包括:

  • alt:多条路径,条件为真时执行
  • opt:任选,仅当条件为真时执行
  • par:并行,每一片段都并发执行
  • loop:循环,片段可多次执行

技术图片

在序列图中,有的消息对应于激活,表示它将会激活一个对象,这种消息称为调用消息;如果消息没有对应激活框,表示它不是一个调用消息,不会引发其他对象的活动,这种消息称为发送消息;如果对象的一个方法调用了自己的另一个方法时,消息是由对象发送给自身,这种消息称为自身消息。序列图中的消息还包括创建消息和销毁消息,创建消息用于使用 new关键字创建另一个对象,而销毁消息用于调用对象的销毁方法将一个对象从内存中销毁

技术图片

举例

某基于Java EE的B/S系统需要提供登录功能,该功能简要描 述如下:用户打开登录界面login.jsp输入数据,向系统提交请 求,系统通过Servlet获取请求数据,将数据传递给业务对象, 业务对象接收数据后再将数据传递给数据访问对象,数据访 问对象对数据库进行操作,查询用户信息,再返回查询结果

技术图片

1.4状态图

用于描述对象的各种状态以及状态之间的转换

1、定义

通常用状态图来描述单个对象的行为,它确定了由事件序列引出的状态序列,但并不是所有的类都需要使用状态图来描述它的行为,只有那些具有重要交互行为的类,我们才会使用状态图来描述

大多数面向对象技术都使用状态图来描述一个对象在其生命周期中的行为,对象从产生到结束,可以处于一系列不同的状态。状态影响对象的行为,当这些状态的数目有限时,就可以用状态图来建模对象的行为,状态图显示了单个类的生命周期,在不同状态下对象可能具有不同的行为

2、状态图组成元素与绘制

状态:又称为中间状态,用圆角矩形框表示,在一个状态图中可有多个状态,每个状态包含两格:上格放置状态名称,下格说明处于该状态时对象可以进行的活动

初始状态:又称为初态,用一个黑色的实心圆圈表示,在一个状态图中只能够有一个初始状态

结束状态:又称为终止状态或终态,用一个实心圆外加一个圆圈表示,在一个状态图中可能有多个结束状态

转移:用从一个状态到另一个状态之间的连线和箭头说明状态的转移情况,并用文字说明引发这个状态变化的相应事件是什么。事件有可能在特定的条件下发生,在 UML中这样的条件称为守护条件,发生事件时的处理也称为动作。状态之间的转移可带有标注,由三部分组成(每一部分都可省略),其语法为:事件名 [条件] / 动作名

在一个状态图中,一个状态也可以被细分为多个子状态,包含多个子状态的状态称为复合状态

举例

某信用卡系统账户具有使用状态和冻结状态,其中使用状态又包括正常状态和透支状态两种子状态。如果账户余额小于零则进入透支状态,透支状态时既可以存款又可以取款,但是透支金额不能超过5000元;如果余额大于零则进入正常状态,正常状态时既可以存款又可以取款;如果连续透支100天,则进入冻结状态,冻结状态下既不能存款又不能取款,必须要求银行工作人员解冻。用户可以在使用状态或冻结状态下请求注销账户

技术图片

二、创建型模式

这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象,使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活

  • 工厂模式(Factory Pattern)
  • 抽象工厂模式(Abstract Factory Pattern)
  • 单例模式(Singleton Pattern)
  • 建造者模式(Builder Pattern)
  • 原型模式(Prototype Pattern)

三、结构型模式

这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式

  • 适配器模式(Adapter Pattern)
  • 桥接模式(Bridge Pattern)
  • 过滤器模式(Filter、Criteria Pattern)
  • 组合模式(Composite Pattern)
  • 装饰器模式(Decorator Pattern)
  • 外观模式(Facade Pattern)
  • 享元模式(Flyweight Pattern)
  • 代理模式(Proxy Pattern)

四、行为型模式

这些设计模式特别关注对象之间的通信

  • 责任链模式(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)

以上是关于设计模式总纲的主要内容,如果未能解决你的问题,请参考以下文章

设计模式总纲

Android面试复习总纲

设计模式入门--设计模式原则(总纲)

设计模式详解(总纲)

设计模式总纲——工厂模式

设计模式总纲