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

📌目录



⚖️ 对象模型技术(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方法应用,我们可以构建出结构清晰、易于维护的高质量软件系统。记住:好的方法是软件成功的保障。


相关推荐
老郑聊AI业财智造3 小时前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程
xierui1231235 小时前
AI创作工作流状态管理:为什么保存 Prompt仍然无法复现作品
人工智能·自动化·prompt·aigc·软件工程
皮卡丘不断更6 小时前
Vibe Coding 做完原型后:给网页项目加上任务、验证和人工确认
人工智能·软件工程
老郑聊AI业财智造10 小时前
TensorFlow 技术架构与源码分析
人工智能·python·深度学习·架构·tensorflow·软件工程
JJJennie77711 小时前
MAI Gateway技术揭秘:大模型网关有哪些功能?从原理到落地
大数据·人工智能·大模型·gateway·软件工程·ai网关
DsirNg1 天前
把 AI 放进一次合并请求:一个批量归档功能的交付闭环
软件工程·测试·代码审查·开发效率·pull request·ai辅助编程·需求拆解
树欲静而风不止861 天前
制造企业研发数字化|APQP+QMS 一体化
软件工程
老郑聊AI业财智造2 天前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
深维AI随笔3 天前
《构建之法》| 第一章概论:软件工程的“第一性原理“,一线交付工程师的读书笔记
大数据·软件工程