使用面向对象开发中的对象模型实现订阅

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 【9月更文挑战第4天】本文介绍面向对象方法采用对象模型、动态模型与功能模型描述软件的不同方面。并且提供代码示例展示了如何通过结构体组合实现继承,并利用全局变量存储医生和患者信息,实现患者订阅医生服务。用户可通过API获取医生和患者列表并完成订阅操作。

0 简介

面向对象方法开发软件时,通常使用对象模型、动态模型和功能模型来描述系统的不同方面。这三种模型各自关注的方面不同,但它们紧密关联,构成了系统的整体设计。以下是每种模型的详细介绍,以及它们在医疗预约系统中的应用:

1. 对象模型(Object Model)

对象模型主要用于描述系统中的静态结构。它定义了系统中的类、对象及它们之间的关系(例如继承、聚合、关联等)。对象模型类似于类图,描述了系统的实体以及实体之间的静态关系。

在预约系统中的应用:

预约界面(Appointment Interface):可以用对象模型来定义预约界面中的组件,例如“预约表单”、“确认按钮”等组件作为对象,并描述它们与“预约对象”(Appointment)之间的关联关系。

数据库访问类(Database Access Class):对象模型可以定义数据库访问类,负责封装数据库的CRUD操作,并与其他业务实体(如医生、患者等)进行关联。

医生列表(Doctor List):医生作为系统中的一个对象类(Doctor),医生列表则可能是一个集合类,与医生类有关联。

医生出诊时段表(Doctor Schedule):出诊时段表可以定义为医生对象的一个属性或是一个独立的类,与医生类相关联。

2 模型设计和对象关系的实践

在Go语言的Web框架Gin中实现患者和医生类,同时体现继承、聚合和关联等对象模型关系,涉及面向对象的概念在Go中的实际应用。Go语言本身不支持传统的继承概念,但可以通过组合(embedding)来模拟继承行为。接下来我们将定义患者和医生类,并实现一个简易的患者订阅Web服务。

继承:Go通过结构体的组合来实现类似继承的功能。我们会定义一个Person结构体,包含患者和医生的公共属性,然后让Patient和Doctor类通过组合来继承Person的属性。

聚合:患者类可以包含一个医生的引用,表示某患者关注某位医生。

关联:医生和患者可以通过ID进行关联,患者可以订阅医生的服务。

3 代码实现 说明

继承:Patient和Doctor类通过嵌入Person结构体实现了类似继承的行为,这意味着它们继承了Person的属性(ID、Name、Age)。

聚合:Patient结构体包含一个SubscribedDoctor指针,该指针指向患者订阅的医生对象,体现了聚合关系。

关联:患者和医生通过ID进行关联,subscribeDoctor方法接收两个参数:patientID和doctorID,用于找到对应的医生和患者并建立订阅关系。

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)
AI 代码解读

定义Person结构体,作为患者和医生的基类

type Person struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}
AI 代码解读

Doctor 结构体,继承Person

type Doctor struct {
    Person
    Specialty string `json:"specialty"`
}
AI 代码解读

Patient 结构体,继承Person,并聚合Doctor

type Patient struct {
    Person
    SubscribedDoctor *Doctor `json:"subscribed_doctor"`
}
AI 代码解读

用于存储医生和患者的全局变量

var doctors = []Doctor{
    {Person: Person{ID: 1, Name: "Dr. Smith", Age: 45}, Specialty: "Cardiology"},
    {Person: Person{ID: 2, Name: "Dr. Johnson", Age: 50}, Specialty: "Neurology"},
}

var patients = []Patient{
    {Person: Person{ID: 1, Name: "Alice", Age: 30}, SubscribedDoctor: nil},
    {Person: Person{ID: 2, Name: "Bob", Age: 40}, SubscribedDoctor: nil},
}
AI 代码解读

获取所有医生列表

func getDoctors(c *gin.Context) {
    c.JSON(http.StatusOK, doctors)
}
AI 代码解读

获取所有患者列表

func getPatients(c *gin.Context) {
    c.JSON(http.StatusOK, patients)
}
AI 代码解读

患者订阅医生服务

func subscribeDoctor(c *gin.Context) {
    patientID := c.Param("patientID")
    doctorID := c.Param("doctorID")

    var patient *Patient
    var doctor *Doctor

    // 查找患者
    for i := range patients {
        if patients[i].Person.ID == patientID {
            patient = &patients[i]
            break
        }
    }

    // 查找医生
    for i := range doctors {
        if doctors[i].Person.ID == doctorID {
            doctor = &doctors[i]
            break
        }
    }

    // 如果找到患者和医生,则进行订阅
    if patient != nil && doctor != nil {
        patient.SubscribedDoctor = doctor
        c.JSON(http.StatusOK, gin.H{
            "message":  "Subscription successful",
            "patient":  patient,
            "doctor":   doctor,
        })
    } else {
        c.JSON(http.StatusNotFound, gin.H{"message": "Patient or Doctor not found"})
    }
}

func main() {
    r := gin.Default()

    // 定义路由
    r.GET("/doctors", getDoctors)
    r.GET("/patients", getPatients)
    r.POST("/patients/:patientID/subscribe/:doctorID", subscribeDoctor)

    // 启动服务
    r.Run(":8080")
}
AI 代码解读

4 使用流程

1 用户访问/doctors路由获取医生列表。
2 用户访问/patients路由获取患者列表。
3 用户通过POST请求访问/patients/:patientID/subscribe/:doctorID来订阅某位医生,

例如:
POST /patients/1/subscribe/2

这将让ID为1的患者订阅ID为2的医生。

5 小结

对象模型关注系统的静态结构,定义类及其关系。在预约系统中,对象模型可用于描述预约界面组件、数据库访问类、医生列表及出诊时段表。通过Go语言Web框架Gin实现患者和医生类,展示继承、聚合与关联的应用。

目录
打赏
0
1
2
0
172
分享
相关文章
【MATLAB】 SSA奇异谱分析信号分解算法
【MATLAB】 SSA奇异谱分析信号分解算法
695 0
使用PyTorch Profiler进行模型性能分析,改善并加速PyTorch训练
加速机器学习模型训练是工程师的关键需求。PyTorch Profiler提供了一种分析工具,用于测量CPU和CUDA时间,以及内存使用情况。通过在训练代码中嵌入分析器并使用tensorboard查看结果,工程师可以识别性能瓶颈。Profiler的`record_function`功能允许为特定操作命名,便于跟踪。优化策略包括使用FlashAttention或FSDP减少内存使用,以及通过torch.compile提升速度。监控CUDA内核执行和内存分配,尤其是避免频繁的cudaMalloc,能有效提升GPU效率。内存历史记录分析有助于检测内存泄漏和优化批处理大小。
1299 1
如何提高 Java 高并发程序的性能?
以下是提升Java高并发程序性能的方法:优化线程池设置,减少锁竞争,使用读写锁和无锁数据结构。利用缓存减少重复计算和数据库查询,并优化数据库操作,采用连接池和分库分表策略。应用异步处理,选择合适的数据结构如`ConcurrentHashMap`。复用对象和资源,使用工具监控性能并定期审查代码,遵循良好编程规范。
k8s学习--利用helm部署应用mysql,加深helm的理解
k8s学习--利用helm部署应用mysql,加深helm的理解
794 0
复动力系统 | 混沌 | Lozi 映射吸引子的可视化与交互式探索
该文介绍了一篇关于Lozi映射吸引子可视化和交互式探索的文章。Lozi映射是混沌理论中的一个模型,展示非线性动力系统的复杂性。通过Python和matplotlib,作者实现了Lozi映射的可视化,并添加交互功能,允许用户缩放以详细观察混沌吸引子。文中还给出了Lozi映射的数学定义,并提供了Python代码示例,演示如何绘制和动态调整吸引子的显示。
主备切换大揭秘:保证系统永不停机的秘密
本文由小米分享,介绍了分布式系统中的主备切换机制,旨在确保高可用性和可靠性。内容涵盖热备和冷备的概念,以及MySQL和Redis的主从复制原理和配置方法。通过主从复制,当主服务器故障时,备服务器能接管工作,维持服务连续性。文章还讨论了主备切换的挑战,如数据一致性与切换延迟,并提出了相应的解决方案。最后,作者鼓励读者就该主题提出疑问和建议。
952 4
探索现代化前端开发的新趋势
本文将介绍现代化前端开发中的新趋势,包括响应式设计、组件化开发、性能优化和可访问性等方面。通过深入探讨这些技术和方法,我们可以更好地应对不断演变的前端开发需求,提升用户体验和开发效率。

云原生

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问