软件工程:对象模型技术方法简介

📌目录



⚖️ 对象模型技术(OMT)方法简介

对象模型技术(Object Modeling Technique, OMT)是由James Rumbaugh提出的一种面向对象分析和设计方法,它通过三个模型来描述系统。本文将详细介绍OMT方法的概念、特点、模型和应用。

🎯 一、OMT方法概述

(一)OMT方法的定义

对象模型技术(OMT)是由James Rumbaugh提出的一种面向对象分析和设计方法,它通过三个模型来描述系统:对象模型、动态模型和功能模型。

OMT方法概念:
#mermaid-svg-HQnsuRYoh2DtF72E{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HQnsuRYoh2DtF72E .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HQnsuRYoh2DtF72E .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HQnsuRYoh2DtF72E .error-icon{fill:#552222;}#mermaid-svg-HQnsuRYoh2DtF72E .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HQnsuRYoh2DtF72E .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HQnsuRYoh2DtF72E .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HQnsuRYoh2DtF72E .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HQnsuRYoh2DtF72E .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HQnsuRYoh2DtF72E .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HQnsuRYoh2DtF72E .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HQnsuRYoh2DtF72E .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HQnsuRYoh2DtF72E .marker.cross{stroke:#333333;}#mermaid-svg-HQnsuRYoh2DtF72E svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HQnsuRYoh2DtF72E p{margin:0;}#mermaid-svg-HQnsuRYoh2DtF72E .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-HQnsuRYoh2DtF72E .cluster-label text{fill:#333;}#mermaid-svg-HQnsuRYoh2DtF72E .cluster-label span{color:#333;}#mermaid-svg-HQnsuRYoh2DtF72E .cluster-label span p{background-color:transparent;}#mermaid-svg-HQnsuRYoh2DtF72E .label text,#mermaid-svg-HQnsuRYoh2DtF72E span{fill:#333;color:#333;}#mermaid-svg-HQnsuRYoh2DtF72E .node rect,#mermaid-svg-HQnsuRYoh2DtF72E .node circle,#mermaid-svg-HQnsuRYoh2DtF72E .node ellipse,#mermaid-svg-HQnsuRYoh2DtF72E .node polygon,#mermaid-svg-HQnsuRYoh2DtF72E .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HQnsuRYoh2DtF72E .rough-node .label text,#mermaid-svg-HQnsuRYoh2DtF72E .node .label text,#mermaid-svg-HQnsuRYoh2DtF72E .image-shape .label,#mermaid-svg-HQnsuRYoh2DtF72E .icon-shape .label{text-anchor:middle;}#mermaid-svg-HQnsuRYoh2DtF72E .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HQnsuRYoh2DtF72E .rough-node .label,#mermaid-svg-HQnsuRYoh2DtF72E .node .label,#mermaid-svg-HQnsuRYoh2DtF72E .image-shape .label,#mermaid-svg-HQnsuRYoh2DtF72E .icon-shape .label{text-align:center;}#mermaid-svg-HQnsuRYoh2DtF72E .node.clickable{cursor:pointer;}#mermaid-svg-HQnsuRYoh2DtF72E .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HQnsuRYoh2DtF72E .arrowheadPath{fill:#333333;}#mermaid-svg-HQnsuRYoh2DtF72E .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HQnsuRYoh2DtF72E .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HQnsuRYoh2DtF72E .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HQnsuRYoh2DtF72E .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HQnsuRYoh2DtF72E .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HQnsuRYoh2DtF72E .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HQnsuRYoh2DtF72E .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HQnsuRYoh2DtF72E .cluster text{fill:#333;}#mermaid-svg-HQnsuRYoh2DtF72E .cluster span{color:#333;}#mermaid-svg-HQnsuRYoh2DtF72E div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HQnsuRYoh2DtF72E .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HQnsuRYoh2DtF72E rect.text{fill:none;stroke-width:0;}#mermaid-svg-HQnsuRYoh2DtF72E .icon-shape,#mermaid-svg-HQnsuRYoh2DtF72E .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HQnsuRYoh2DtF72E .icon-shape p,#mermaid-svg-HQnsuRYoh2DtF72E .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HQnsuRYoh2DtF72E .icon-shape .label rect,#mermaid-svg-HQnsuRYoh2DtF72E .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HQnsuRYoh2DtF72E .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HQnsuRYoh2DtF72E .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HQnsuRYoh2DtF72E :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} OMT方法
对象模型
动态模型
功能模型
静态结构
动态行为
功能流程

(二)OMT方法的历史

OMT方法历史:

时间 事件 意义
1991 OMT方法发布 完整的OO方法
1992 著作出版 《面向对象建模与设计》
1995 与Booch合并 形成UML基础
1997 UML发布 成为标准

(三)OMT方法的特点

OMT方法特点:

特点 说明
模型化 三个模型描述
完整性 覆盖完整过程
清晰性 结构清晰
可视化 图形化表示
实用性 注重实际应用

📦 二、OMT方法的三个模型

(一)模型概览

三个模型:
#mermaid-svg-2M6RStycOXFuls0L{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2M6RStycOXFuls0L .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2M6RStycOXFuls0L .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2M6RStycOXFuls0L .error-icon{fill:#552222;}#mermaid-svg-2M6RStycOXFuls0L .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2M6RStycOXFuls0L .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2M6RStycOXFuls0L .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2M6RStycOXFuls0L .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2M6RStycOXFuls0L .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2M6RStycOXFuls0L .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2M6RStycOXFuls0L .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2M6RStycOXFuls0L .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2M6RStycOXFuls0L .marker.cross{stroke:#333333;}#mermaid-svg-2M6RStycOXFuls0L svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2M6RStycOXFuls0L p{margin:0;}#mermaid-svg-2M6RStycOXFuls0L .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2M6RStycOXFuls0L .cluster-label text{fill:#333;}#mermaid-svg-2M6RStycOXFuls0L .cluster-label span{color:#333;}#mermaid-svg-2M6RStycOXFuls0L .cluster-label span p{background-color:transparent;}#mermaid-svg-2M6RStycOXFuls0L .label text,#mermaid-svg-2M6RStycOXFuls0L span{fill:#333;color:#333;}#mermaid-svg-2M6RStycOXFuls0L .node rect,#mermaid-svg-2M6RStycOXFuls0L .node circle,#mermaid-svg-2M6RStycOXFuls0L .node ellipse,#mermaid-svg-2M6RStycOXFuls0L .node polygon,#mermaid-svg-2M6RStycOXFuls0L .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2M6RStycOXFuls0L .rough-node .label text,#mermaid-svg-2M6RStycOXFuls0L .node .label text,#mermaid-svg-2M6RStycOXFuls0L .image-shape .label,#mermaid-svg-2M6RStycOXFuls0L .icon-shape .label{text-anchor:middle;}#mermaid-svg-2M6RStycOXFuls0L .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2M6RStycOXFuls0L .rough-node .label,#mermaid-svg-2M6RStycOXFuls0L .node .label,#mermaid-svg-2M6RStycOXFuls0L .image-shape .label,#mermaid-svg-2M6RStycOXFuls0L .icon-shape .label{text-align:center;}#mermaid-svg-2M6RStycOXFuls0L .node.clickable{cursor:pointer;}#mermaid-svg-2M6RStycOXFuls0L .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2M6RStycOXFuls0L .arrowheadPath{fill:#333333;}#mermaid-svg-2M6RStycOXFuls0L .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2M6RStycOXFuls0L .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2M6RStycOXFuls0L .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2M6RStycOXFuls0L .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2M6RStycOXFuls0L .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2M6RStycOXFuls0L .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2M6RStycOXFuls0L .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2M6RStycOXFuls0L .cluster text{fill:#333;}#mermaid-svg-2M6RStycOXFuls0L .cluster span{color:#333;}#mermaid-svg-2M6RStycOXFuls0L div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2M6RStycOXFuls0L .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2M6RStycOXFuls0L rect.text{fill:none;stroke-width:0;}#mermaid-svg-2M6RStycOXFuls0L .icon-shape,#mermaid-svg-2M6RStycOXFuls0L .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2M6RStycOXFuls0L .icon-shape p,#mermaid-svg-2M6RStycOXFuls0L .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2M6RStycOXFuls0L .icon-shape .label rect,#mermaid-svg-2M6RStycOXFuls0L .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2M6RStycOXFuls0L .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2M6RStycOXFuls0L .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2M6RStycOXFuls0L :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 三个模型
对象模型
动态模型
功能模型
描述结构
描述行为
描述功能
类图
状态图
数据流图

(二)对象模型

对象模型描述系统的静态结构,是三个模型中最核心的模型。

对象模型内容:

内容 说明
类 系统中的类
对象 对象实例
关系 类之间的关系
属性 类的属性
操作 类的方法

对象模型示例:
#mermaid-svg-1vTWCqFJ38l6IAE2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1vTWCqFJ38l6IAE2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1vTWCqFJ38l6IAE2 .error-icon{fill:#552222;}#mermaid-svg-1vTWCqFJ38l6IAE2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1vTWCqFJ38l6IAE2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1vTWCqFJ38l6IAE2 .marker.cross{stroke:#333333;}#mermaid-svg-1vTWCqFJ38l6IAE2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1vTWCqFJ38l6IAE2 p{margin:0;}#mermaid-svg-1vTWCqFJ38l6IAE2 g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-1vTWCqFJ38l6IAE2 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-1vTWCqFJ38l6IAE2 .cluster-label text{fill:#333;}#mermaid-svg-1vTWCqFJ38l6IAE2 .cluster-label span{color:#333;}#mermaid-svg-1vTWCqFJ38l6IAE2 .cluster-label span p{background-color:transparent;}#mermaid-svg-1vTWCqFJ38l6IAE2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1vTWCqFJ38l6IAE2 .cluster text{fill:#333;}#mermaid-svg-1vTWCqFJ38l6IAE2 .cluster span{color:#333;}#mermaid-svg-1vTWCqFJ38l6IAE2 .nodeLabel,#mermaid-svg-1vTWCqFJ38l6IAE2 .edgeLabel{color:#131300;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-1vTWCqFJ38l6IAE2 .label text{fill:#131300;}#mermaid-svg-1vTWCqFJ38l6IAE2 .labelBkg{background:#ECECFF;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-1vTWCqFJ38l6IAE2 .classTitle{font-weight:bolder;}#mermaid-svg-1vTWCqFJ38l6IAE2 .node rect,#mermaid-svg-1vTWCqFJ38l6IAE2 .node circle,#mermaid-svg-1vTWCqFJ38l6IAE2 .node ellipse,#mermaid-svg-1vTWCqFJ38l6IAE2 .node polygon,#mermaid-svg-1vTWCqFJ38l6IAE2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1vTWCqFJ38l6IAE2 .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 g.clickable{cursor:pointer;}#mermaid-svg-1vTWCqFJ38l6IAE2 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-1vTWCqFJ38l6IAE2 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-1vTWCqFJ38l6IAE2 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-1vTWCqFJ38l6IAE2 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-1vTWCqFJ38l6IAE2 .dashed-line{stroke-dasharray:3;}#mermaid-svg-1vTWCqFJ38l6IAE2 .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-1vTWCqFJ38l6IAE2 #compositionStart,#mermaid-svg-1vTWCqFJ38l6IAE2 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 #compositionEnd,#mermaid-svg-1vTWCqFJ38l6IAE2 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 #dependencyStart,#mermaid-svg-1vTWCqFJ38l6IAE2 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 #dependencyStart,#mermaid-svg-1vTWCqFJ38l6IAE2 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 #extensionStart,#mermaid-svg-1vTWCqFJ38l6IAE2 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 #extensionEnd,#mermaid-svg-1vTWCqFJ38l6IAE2 .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 #aggregationStart,#mermaid-svg-1vTWCqFJ38l6IAE2 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 #aggregationEnd,#mermaid-svg-1vTWCqFJ38l6IAE2 .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 #lollipopStart,#mermaid-svg-1vTWCqFJ38l6IAE2 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 #lollipopEnd,#mermaid-svg-1vTWCqFJ38l6IAE2 .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1vTWCqFJ38l6IAE2 .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-1vTWCqFJ38l6IAE2 .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1vTWCqFJ38l6IAE2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1vTWCqFJ38l6IAE2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1vTWCqFJ38l6IAE2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} borrowed by
borrows
has
has
1
1
1
1
0..1
0..*
0..*
0..*
Book
+book_id: String
+title: String
+author: String
+isbn: String
+is_borrowed: boolean
+borrow(reader: Reader)
+return_book()
Reader
+reader_id: String
+name: String
+max_books: int
+borrow_book(book: Book)
+return_book(book: Book)
BorrowRecord
+reader: Reader
+book: Book
+borrow_date: Date
+return_date: Date

对象模型代码示例:

python 复制代码
# 对象模型
class Book:
    """图书类"""
    def __init__(self, book_id, title, author, isbn):
        self.book_id = book_id
        self.title = title
        self.author = author
        self.isbn = isbn
        self.is_borrowed = False
        self.borrower = None
    
    def borrow(self, reader):
        """借阅"""
        if not self.is_borrowed:
            self.is_borrowed = True
            self.borrower = reader
            return True
        return False
    
    def return_book(self):
        """归还"""
        if self.is_borrowed:
            self.is_borrowed = False
            self.borrower = None
            return True
        return False

class Reader:
    """读者类"""
    def __init__(self, reader_id, name, max_books=5):
        self.reader_id = reader_id
        self.name = name
        self.max_books = max_books
        self.borrowed_books = []
    
    def borrow_book(self, book):
        """借阅图书"""
        if len(self.borrowed_books) < self.max_books:
            if book.borrow(self):
                self.borrowed_books.append(book)
                return True
        return False
    
    def return_book(self, book):
        """归还图书"""
        if book in self.borrowed_books:
            if book.return_book():
                self.borrowed_books.remove(book)
                return True
        return False

(三)动态模型

动态模型描述系统的动态行为,包括对象的状态变化和交互。

动态模型内容:

内容 说明
状态 对象的状态
事件 触发状态变化
转换 状态转换
交互 对象交互

动态模型示例:
#mermaid-svg-xb0R2dFYK91SVxlU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xb0R2dFYK91SVxlU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xb0R2dFYK91SVxlU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xb0R2dFYK91SVxlU .error-icon{fill:#552222;}#mermaid-svg-xb0R2dFYK91SVxlU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xb0R2dFYK91SVxlU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xb0R2dFYK91SVxlU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xb0R2dFYK91SVxlU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xb0R2dFYK91SVxlU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xb0R2dFYK91SVxlU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xb0R2dFYK91SVxlU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xb0R2dFYK91SVxlU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xb0R2dFYK91SVxlU .marker.cross{stroke:#333333;}#mermaid-svg-xb0R2dFYK91SVxlU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xb0R2dFYK91SVxlU p{margin:0;}#mermaid-svg-xb0R2dFYK91SVxlU defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-xb0R2dFYK91SVxlU g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-xb0R2dFYK91SVxlU g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-xb0R2dFYK91SVxlU g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-xb0R2dFYK91SVxlU g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-xb0R2dFYK91SVxlU g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-xb0R2dFYK91SVxlU .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-xb0R2dFYK91SVxlU .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-xb0R2dFYK91SVxlU .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-xb0R2dFYK91SVxlU .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-xb0R2dFYK91SVxlU .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-xb0R2dFYK91SVxlU .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-xb0R2dFYK91SVxlU .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-xb0R2dFYK91SVxlU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xb0R2dFYK91SVxlU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xb0R2dFYK91SVxlU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xb0R2dFYK91SVxlU .edgeLabel .label text{fill:#333;}#mermaid-svg-xb0R2dFYK91SVxlU .label div .edgeLabel{color:#333;}#mermaid-svg-xb0R2dFYK91SVxlU .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-xb0R2dFYK91SVxlU .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-xb0R2dFYK91SVxlU .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-xb0R2dFYK91SVxlU .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-xb0R2dFYK91SVxlU .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-xb0R2dFYK91SVxlU .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xb0R2dFYK91SVxlU .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xb0R2dFYK91SVxlU #statediagram-barbEnd{fill:#333333;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xb0R2dFYK91SVxlU .cluster-label,#mermaid-svg-xb0R2dFYK91SVxlU .nodeLabel{color:#131300;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-xb0R2dFYK91SVxlU .note-edge{stroke-dasharray:5;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-note text{fill:black;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram-note .nodeLabel{color:black;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagram .edgeLabel{color:red;}#mermaid-svg-xb0R2dFYK91SVxlU #dependencyStart,#mermaid-svg-xb0R2dFYK91SVxlU #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-xb0R2dFYK91SVxlU .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xb0R2dFYK91SVxlU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 借阅事件
归还事件
可借阅
预约事件
取消预约
在馆
预约中
已借出
超期事件
续借事件
正常借阅
逾期未还

动态模型代码示例:

python 复制代码
# 动态模型
class Book:
    """图书类 - 动态模型"""
    
    def __init__(self, book_id, title):
        self.book_id = book_id
        self.title = title
        self.state = "可借阅"  # 初始状态
        self.borrower = None
        self.borrow_date = None
        self.due_date = None
    
    # 事件处理
    def on_borrow(self, reader, days=30):
        """借阅事件"""
        if self.state == "可借阅":
            self.state = "已借出"
            self.borrower = reader
            self.borrow_date = datetime.now()
            self.due_date = datetime.now() + timedelta(days=days)
            return True
        return False
    
    def on_return(self):
        """归还事件"""
        if self.state == "已借出":
            self.state = "可借阅"
            self.borrower = None
            self.borrow_date = None
            self.due_date = None
            return True
        return False
    
    def on_renew(self, days=30):
        """续借事件"""
        if self.state == "已借出":
            if self.due_date and datetime.now() < self.due_date:
                self.due_date += timedelta(days=days)
                return True
        return False
    
    def on_overdue_check(self):
        """超期检查事件"""
        if self.state == "已借出" and self.due_date:
            if datetime.now() > self.due_date:
                self.state = "逾期未还"
                return True
        return False

(四)功能模型

功能模型描述系统的功能流程,展示数据在系统中的流动。

功能模型内容:

内容 说明
过程 数据处理过程
数据流 数据流动
存储 数据存储
外部实体 外部实体

功能模型示例:
#mermaid-svg-hIx8gJma0ySSXOmW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hIx8gJma0ySSXOmW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hIx8gJma0ySSXOmW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hIx8gJma0ySSXOmW .error-icon{fill:#552222;}#mermaid-svg-hIx8gJma0ySSXOmW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hIx8gJma0ySSXOmW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hIx8gJma0ySSXOmW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hIx8gJma0ySSXOmW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hIx8gJma0ySSXOmW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hIx8gJma0ySSXOmW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hIx8gJma0ySSXOmW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hIx8gJma0ySSXOmW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hIx8gJma0ySSXOmW .marker.cross{stroke:#333333;}#mermaid-svg-hIx8gJma0ySSXOmW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hIx8gJma0ySSXOmW p{margin:0;}#mermaid-svg-hIx8gJma0ySSXOmW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hIx8gJma0ySSXOmW .cluster-label text{fill:#333;}#mermaid-svg-hIx8gJma0ySSXOmW .cluster-label span{color:#333;}#mermaid-svg-hIx8gJma0ySSXOmW .cluster-label span p{background-color:transparent;}#mermaid-svg-hIx8gJma0ySSXOmW .label text,#mermaid-svg-hIx8gJma0ySSXOmW span{fill:#333;color:#333;}#mermaid-svg-hIx8gJma0ySSXOmW .node rect,#mermaid-svg-hIx8gJma0ySSXOmW .node circle,#mermaid-svg-hIx8gJma0ySSXOmW .node ellipse,#mermaid-svg-hIx8gJma0ySSXOmW .node polygon,#mermaid-svg-hIx8gJma0ySSXOmW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hIx8gJma0ySSXOmW .rough-node .label text,#mermaid-svg-hIx8gJma0ySSXOmW .node .label text,#mermaid-svg-hIx8gJma0ySSXOmW .image-shape .label,#mermaid-svg-hIx8gJma0ySSXOmW .icon-shape .label{text-anchor:middle;}#mermaid-svg-hIx8gJma0ySSXOmW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hIx8gJma0ySSXOmW .rough-node .label,#mermaid-svg-hIx8gJma0ySSXOmW .node .label,#mermaid-svg-hIx8gJma0ySSXOmW .image-shape .label,#mermaid-svg-hIx8gJma0ySSXOmW .icon-shape .label{text-align:center;}#mermaid-svg-hIx8gJma0ySSXOmW .node.clickable{cursor:pointer;}#mermaid-svg-hIx8gJma0ySSXOmW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hIx8gJma0ySSXOmW .arrowheadPath{fill:#333333;}#mermaid-svg-hIx8gJma0ySSXOmW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hIx8gJma0ySSXOmW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hIx8gJma0ySSXOmW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hIx8gJma0ySSXOmW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hIx8gJma0ySSXOmW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hIx8gJma0ySSXOmW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hIx8gJma0ySSXOmW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hIx8gJma0ySSXOmW .cluster text{fill:#333;}#mermaid-svg-hIx8gJma0ySSXOmW .cluster span{color:#333;}#mermaid-svg-hIx8gJma0ySSXOmW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hIx8gJma0ySSXOmW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hIx8gJma0ySSXOmW rect.text{fill:none;stroke-width:0;}#mermaid-svg-hIx8gJma0ySSXOmW .icon-shape,#mermaid-svg-hIx8gJma0ySSXOmW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hIx8gJma0ySSXOmW .icon-shape p,#mermaid-svg-hIx8gJma0ySSXOmW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hIx8gJma0ySSXOmW .icon-shape .label rect,#mermaid-svg-hIx8gJma0ySSXOmW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hIx8gJma0ySSXOmW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hIx8gJma0ySSXOmW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hIx8gJma0ySSXOmW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 借阅请求
查询图书
图书信息
查询读者
读者信息
创建记录
借阅成功
归还请求
查询记录
记录信息
更新图书
更新读者
归还成功
读者
借阅处理
图书数据库
读者数据库
借阅记录
读者
归还处理

功能模型代码示例:

python 复制代码
# 功能模型
class BorrowProcess:
    """借阅处理过程"""
    
    def __init__(self, book_repo, reader_repo, record_repo):
        self.book_repo = book_repo
        self.reader_repo = reader_repo
        self.record_repo = record_repo
    
    def process_borrow(self, reader_id, book_id):
        """处理借阅"""
        # 1. 查询图书
        book = self.book_repo.find_by_id(book_id)
        if not book:
            return {"success": False, "message": "图书不存在"}
        
        # 2. 查询读者
        reader = self.reader_repo.find_by_id(reader_id)
        if not reader:
            return {"success": False, "message": "读者不存在"}
        
        # 3. 检查可借
        if book.is_borrowed:
            return {"success": False, "message": "图书已借出"}
        
        # 4. 检查读者资格
        if len(reader.borrowed_books) >= reader.max_books:
            return {"success": False, "message": "达到借阅上限"}
        
        # 5. 执行借阅
        if book.borrow(reader):
            # 6. 创建记录
            record = BorrowRecord(reader, book, datetime.now())
            self.record_repo.save(record)
            return {"success": True, "message": "借阅成功"}
        
        return {"success": False, "message": "借阅失败"}

class ReturnProcess:
    """归还处理过程"""
    
    def __init__(self, book_repo, reader_repo, record_repo):
        self.book_repo = book_repo
        self.reader_repo = reader_repo
        self.record_repo = record_repo
    
    def process_return(self, reader_id, book_id):
        """处理归还"""
        # 1. 查询记录
        record = self.record_repo.find_by_reader_and_book(reader_id, book_id)
        if not record:
            return {"success": False, "message": "借阅记录不存在"}
        
        # 2. 更新记录
        record.return_date = datetime.now()
        self.record_repo.save(record)
        
        # 3. 归还图书
        book = self.book_repo.find_by_id(book_id)
        reader = self.reader_repo.find_by_id(reader_id)
        
        if book.return_book():
            if book in reader.borrowed_books:
                reader.borrowed_books.remove(book)
            return {"success": True, "message": "归还成功"}
        
        return {"success": False, "message": "归还失败"}

🌐 三、OMT方法的过程

(一)过程概览

OMT过程:
#mermaid-svg-a6U9Xg4mXdxaf2A8{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .error-icon{fill:#552222;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .marker.cross{stroke:#333333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-a6U9Xg4mXdxaf2A8 p{margin:0;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .cluster-label text{fill:#333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .cluster-label span{color:#333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .cluster-label span p{background-color:transparent;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .label text,#mermaid-svg-a6U9Xg4mXdxaf2A8 span{fill:#333;color:#333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .node rect,#mermaid-svg-a6U9Xg4mXdxaf2A8 .node circle,#mermaid-svg-a6U9Xg4mXdxaf2A8 .node ellipse,#mermaid-svg-a6U9Xg4mXdxaf2A8 .node polygon,#mermaid-svg-a6U9Xg4mXdxaf2A8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .rough-node .label text,#mermaid-svg-a6U9Xg4mXdxaf2A8 .node .label text,#mermaid-svg-a6U9Xg4mXdxaf2A8 .image-shape .label,#mermaid-svg-a6U9Xg4mXdxaf2A8 .icon-shape .label{text-anchor:middle;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .rough-node .label,#mermaid-svg-a6U9Xg4mXdxaf2A8 .node .label,#mermaid-svg-a6U9Xg4mXdxaf2A8 .image-shape .label,#mermaid-svg-a6U9Xg4mXdxaf2A8 .icon-shape .label{text-align:center;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .node.clickable{cursor:pointer;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .arrowheadPath{fill:#333333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-a6U9Xg4mXdxaf2A8 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-a6U9Xg4mXdxaf2A8 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-a6U9Xg4mXdxaf2A8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .cluster text{fill:#333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .cluster span{color:#333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-a6U9Xg4mXdxaf2A8 rect.text{fill:none;stroke-width:0;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .icon-shape,#mermaid-svg-a6U9Xg4mXdxaf2A8 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .icon-shape p,#mermaid-svg-a6U9Xg4mXdxaf2A8 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .icon-shape .label rect,#mermaid-svg-a6U9Xg4mXdxaf2A8 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-a6U9Xg4mXdxaf2A8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-a6U9Xg4mXdxaf2A8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-a6U9Xg4mXdxaf2A8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} OMT过程
分析
系统设计
对象设计
建立对象模型
建立动态模型
建立功能模型
架构设计
问题域设计
人机交互设计
任务管理设计
数据管理设计
类设计
方法设计
关联设计

(二)分析阶段

分析阶段:

分析任务:

任务 说明
对象模型建立 建立对象模型
动态模型建立 建立动态模型
功能模型建立 建立功能模型
模型集成 集成三个模型

分析示例:

python 复制代码
# 分析阶段
# 1. 建立对象模型
class ObjectModel:
    """对象模型"""
    def __init__(self):
        self.classes = {}
        self.relationships = []
    
    def add_class(self, class_name, attributes, operations):
        self.classes[class_name] = {
            "attributes": attributes,
            "operations": operations
        }
    
    def add_relationship(self, class1, class2, rel_type):
        self.relationships.append({
            "class1": class1,
            "class2": class2,
            "type": rel_type
        })

# 2. 建立动态模型
class DynamicModel:
    """动态模型"""
    def __init__(self):
        self.state_diagrams = {}
    
    def add_state_diagram(self, class_name, states, transitions):
        self.state_diagrams[class_name] = {
            "states": states,
            "transitions": transitions
        }

# 3. 建立功能模型
class FunctionalModel:
    """功能模型"""
    def __init__(self):
        self.processes = {}
        self.data_flows = []
    
    def add_process(self, process_name, inputs, outputs):
        self.processes[process_name] = {
            "inputs": inputs,
            "outputs": outputs
        }

# 4. 模型集成
class OMTAnalysis:
    """OMT分析"""
    def __init__(self):
        self.object_model = ObjectModel()
        self.dynamic_model = DynamicModel()
        self.functional_model = FunctionalModel()
    
    def analyze(self, requirements):
        """分析需求"""
        # 建立对象模型
        self.object_model.add_class("Book", 
            ["book_id", "title", "author"], 
            ["borrow", "return_book"])
        
        # 建立动态模型
        self.dynamic_model.add_state_diagram("Book",
            ["可借阅", "已借出"],
            [("可借阅", "已借出", "借阅"), ("已借出", "可借阅", "归还")])
        
        # 建立功能模型
        self.functional_model.add_process("借阅处理",
            ["借阅请求"],
            ["借阅结果"])

(三)系统设计阶段

系统设计阶段:

设计任务:

任务 说明
架构设计 设计系统架构
问题域设计 设计问题域
人机交互设计 设计人机交互
任务管理设计 设计任务管理
数据管理设计 设计数据管理

系统设计示例:

python 复制代码
# 系统设计
# 1. 架构设计
class SystemArchitecture:
    """系统架构"""
    def __init__(self):
        self.layers = []
    
    def add_layer(self, name, description):
        self.layers.append({
            "name": name,
            "description": description
        })

# 2. 问题域设计
class ProblemDomain:
    """问题域"""
    def __init__(self):
        self.classes = {}
    
    def add_class(self, class_name, class_obj):
        self.classes[class_name] = class_obj

# 3. 人机交互设计
class HumanComputerInteraction:
    """人机交互"""
    def __init__(self):
        self.interfaces = {}
    
    def add_interface(self, interface_name, interface_obj):
        self.interfaces[interface_name] = interface_obj

# 4. 任务管理设计
class TaskManagement:
    """任务管理"""
    def __init__(self):
        self.tasks = {}
    
    def add_task(self, task_name, task_obj):
        self.tasks[task_name] = task_obj

# 5. 数据管理设计
class DataManagement:
    """数据管理"""
    def __init__(self):
        self.stores = {}
    
    def add_store(self, store_name, store_obj):
        self.stores[store_name] = store_obj

# 系统设计示例
class LibrarySystemDesign:
    """图书馆系统设计"""
    def __init__(self):
        self.architecture = SystemArchitecture()
        self.problem_domain = ProblemDomain()
        self.hci = HumanComputerInteraction()
        self.task_mgmt = TaskManagement()
        self.data_mgmt = DataManagement()
    
    def design(self):
        """设计系统"""
        # 1. 架构设计
        self.architecture.add_layer("表示层", "用户界面")
        self.architecture.add_layer("业务层", "业务逻辑")
        self.architecture.add_layer("数据层", "数据访问")
        
        # 2. 问题域设计
        self.problem_domain.add_class("Book", Book)
        self.problem_domain.add_class("Reader", Reader)
        
        # 3. 人机交互设计
        self.hci.add_interface("BookView", BookView)
        
        # 4. 任务管理设计
        self.task_mgmt.add_task("BorrowTask", BorrowTask)
        
        # 5. 数据管理设计
        self.data_mgmt.add_store("BookDB", BookDB)

(四)对象设计阶段

对象设计阶段:

设计任务:

任务 说明
类设计 设计类的详细结构
方法设计 设计方法的详细逻辑
关联设计 设计类间关系
算法设计 设计算法

对象设计示例:

python 复制代码
# 对象设计
# 1. 类设计
class Book:
    """图书类 - 详细设计"""
    
    def __init__(self, book_id, title, author, isbn, category, price):
        # 属性设计
        self.book_id = book_id
        self.title = title
        self.author = author
        self.isbn = isbn
        self.category = category
        self.price = price
        self.is_borrowed = False
        self.borrower = None
        self.borrow_date = None
        self.due_date = None
    
    # 方法设计
    def borrow(self, reader, days=30):
        """借阅方法"""
        if not self.is_borrowed:
            self.is_borrowed = True
            self.borrower = reader
            self.borrow_date = datetime.now()
            self.due_date = datetime.now() + timedelta(days=days)
            return True
        return False
    
    def return_book(self):
        """归还方法"""
        if self.is_borrowed:
            self.is_borrowed = False
            self.borrower = None
            self.borrow_date = None
            self.due_date = None
            return True
        return False
    
    def renew(self, days=30):
        """续借方法"""
        if self.is_borrowed and self.due_date:
            if datetime.now() < self.due_date:
                self.due_date += timedelta(days=days)
                return True
        return False
    
    def check_overdue(self):
        """检查逾期方法"""
        if self.is_borrowed and self.due_date:
            return datetime.now() > self.due_date
        return False
    
    def get_info(self):
        """获取信息方法"""
        status = "已借出" if self.is_borrowed else "可借阅"
        return f"《{self.title}》- {self.author} [{status}]"

# 2. 关联设计
class Reader:
    """读者类"""
    def __init__(self, reader_id, name, max_books=5):
        self.reader_id = reader_id
        self.name = name
        self.max_books = max_books
        self.borrowed_books = []  # 关联:读者关联图书
    
    def borrow_book(self, book):
        """借阅图书"""
        if len(self.borrowed_books) < self.max_books:
            if book.borrow(self):
                self.borrowed_books.append(book)
                return True
        return False

💡 四、OMT方法的应用

(一)应用背景

项目:电商系统

需求描述:

  • 商品管理
  • 订单管理
  • 用户管理
  • 支付管理

(二)对象模型

对象模型:

python 复制代码
# 对象模型
class Product:
    """商品类"""
    def __init__(self, product_id, name, price, stock):
        self.product_id = product_id
        self.name = name
        self.price = price
        self.stock = stock
    
    def is_available(self, quantity=1):
        return self.stock >= quantity
    
    def reduce_stock(self, quantity):
        if self.is_available(quantity):
            self.stock -= quantity
            return True
        return False

class Order:
    """订单类"""
    def __init__(self, order_id, user):
        self.order_id = order_id
        self.user = user
        self.items = []
        self.status = "待支付"
        self.total_amount = 0
    
    def add_item(self, product, quantity):
        if product.reduce_stock(quantity):
            item = OrderItem(product, quantity)
            self.items.append(item)
            self.total_amount += product.price * quantity
            return True
        return False
    
    def pay(self, payment_method):
        if payment_method.pay(self.total_amount):
            self.status = "已支付"
            return True
        return False

class User:
    """用户类"""
    def __init__(self, user_id, username, email):
        self.user_id = user_id
        self.username = username
        self.email = email
        self.orders = []
    
    def place_order(self, order):
        self.orders.append(order)

(三)动态模型

动态模型:

python 复制代码
# 动态模型
class Order:
    """订单类 - 动态模型"""
    
    def __init__(self, order_id, user):
        self.order_id = order_id
        self.user = user
        self.items = []
        self.state = "待支付"  # 状态
        self.total_amount = 0
    
    # 状态转换
    def on_pay(self, payment_method):
        """支付事件"""
        if self.state == "待支付":
            if payment_method.pay(self.total_amount):
                self.state = "已支付"
                return True
        return False
    
    def on_ship(self):
        """发货事件"""
        if self.state == "已支付":
            self.state = "已发货"
            return True
        return False
    
    def on_complete(self):
        """完成事件"""
        if self.state == "已发货":
            self.state = "已完成"
            return True
        return False
    
    def on_cancel(self):
        """取消事件"""
        if self.state in ["待支付", "已支付"]:
            self.state = "已取消"
            return True
        return False

(四)功能模型

功能模型:

python 复制代码
# 功能模型
class OrderProcess:
    """订单处理过程"""
    
    def __init__(self, product_service, payment_service):
        self.product_service = product_service
        self.payment_service = payment_service
    
    def process_order(self, user, product_ids):
        """处理订单"""
        # 1. 创建订单
        order = Order(f"O{datetime.now().timestamp()}", user)
        
        # 2. 添加商品
        for product_id in product_ids:
            product = self.product_service.get_product(product_id)
            if product:
                order.add_item(product, 1)
        
        # 3. 处理支付
        if order.total_amount > 0:
            payment_method = self.payment_service.get_default_method()
            if order.pay(payment_method):
                return {"success": True, "order": order}
        
        return {"success": False, "message": "订单处理失败"}

📊 五、OMT方法与其他方法的比较

(一)方法比较

方法比较:

方法 特点 优点 缺点
OMT 三模型 清晰、完整 复杂
Booch 实用性 完整、实用 复杂
Coad/Yourdon 层次化 清晰、易用 不够灵活
UML 标准化 统一、标准 学习成本高

(二)OMT方法的优势

OMT方法优势:

优势 说明
完整性 三个模型完整描述
清晰性 结构清晰
可视化 图形化表示
实用性 注重实际应用

(三)OMT方法的局限

OMT方法局限:

局限 说明
复杂性 三个模型较复杂
学习成本 学习成本较高
集成难度 模型集成有难度

📝 总结

OMT方法是面向对象设计的重要方法。

🎯 OMT方法定义:OMT方法是由James Rumbaugh提出的一种面向对象分析和设计方法,它通过三个模型来描述系统:对象模型、动态模型和功能模型。

📦 三个模型:

  • 对象模型:描述系统的静态结构
  • 动态模型:描述系统的动态行为
  • 功能模型:描述系统的功能流程

💡 OMT过程:

  • 分析阶段:建立三个模型
  • 系统设计阶段:设计系统架构
  • 对象设计阶段:设计类的详细结构

📊 方法比较:

  • OMT:三模型、清晰、完整
  • Booch:实用性、完整、复杂
  • Coad/Yourdon:层次化、清晰、易用
  • UML:标准化、统一、标准

核心启示:OMT方法是面向对象设计的重要方法,它通过三个模型(对象模型、动态模型、功能模型)来完整描述系统。理解OMT方法的概念和过程,掌握三个模型的内容和应用,是掌握面向对象设计的关键。在实际工作中,我们需要注意:第一,深入理解三个模型的概念和作用(对象模型、动态模型、功能模型);第二,掌握OMT的过程(分析、系统设计、对象设计);第三,合理应用OMT方法进行系统开发;第四,结合其他方法(如UML)取长补短;第五,注重实践,在实际项目中应用OMT方法。OMT方法不仅是面向对象设计的工具,更是我们理解和建模复杂系统的重要方法。通过合理的OMT方法应用,我们可以构建出结构清晰、易于维护的高质量软件系统。记住:好的方法是软件成功的保障。


相关推荐
对讲机数码科普16 小时前
数字集群对讲工程全流程拆解:DMR/ePDT 制式选型、组网落地与运维实战
运维·软件工程
硅谷秋水17 小时前
EmbodiedSWE:面向长时程灵巧机器人的编程智能体
人工智能·机器学习·语言模型·机器人·软件工程
郝学胜-神的一滴17 小时前
C++ Templates 03:手写一个Stack看透模板核心机制
开发语言·c++·产品运营·软件工程·产品经理
rolt18 小时前
05 医学 ISO 13940-用UML表示的行业标准,健康信息学 — 支持照护连续性的概念体系
软件工程·架构师·uml
️公子19 小时前
决策模型开战:Jev / Decisions API / Strands Decider 的 ClosedSet、置信度闸门与混合 Agent
人工智能·大模型·软件工程·agent·决策模型
蜗牛互联网2 天前
从Barclays扩大Claude部署看受监管软件工程的责任重分配
java·大数据·人工智能·后端·软件工程
rolt2 天前
3GPP-5G-用UML表示的行业标准-04电信移动通信
软件工程·ddd·uml·ontology
LEO的MATRIX2 天前
本体实施指南
人工智能·软件工程
梁辰兴2 天前
软件工程:面向规模的度量
软件工程·梁辰兴·规模度量·度量定义·面向规模的度量·生产力度量·质量度量