当前位置: 首页 > news >正文

编程江湖-设计模式

菜鸟阿P的逆袭:用设计模式驯服“需求怪兽”

阿P,一个刚毕业的码农,加入了“江湖科技有限公司”。他的第一个任务:给公司的核心产品“江湖通APP”添加一个 “武林秘籍推送” 功能。

噩梦开局:面条代码

阿P兴冲冲打开代码,眼前一黑:

# 原来的代码 - 一团乱麻!
class UserManager:def __init__(self):self.users = []  # 用户列表# ... 其他用户相关代码 ...def add_user(self, user):self.users.append(user)# 硬编码的通知方式!新增推送秘籍,要改这里!print(f"【邮件】通知:新用户 {user.name} 注册成功!")  # 邮件通知# 如果还要短信通知、APP推送?再加几行?不敢想!class SecretManager:def __init__(self):self.secrets = []  # 秘籍列表def add_secret(self, secret):self.secrets.append(secret)# 秘籍添加也要通知?再写一遍通知代码?print(f"【系统消息】新秘籍《{secret.title}》上架!")# 通知方式也写死了!要改全得动!# 使用
user_mgr = UserManager()
user_mgr.add_user(User("张无忌"))  # 输出:【邮件】通知:新用户 张无忌 注册成功!secret_mgr = SecretManager()
secret_mgr.add_secret(Secret("九阳神功"))  # 输出:【系统消息】新秘籍《九阳神功》上架!

问题来了:

  1. 通知方式硬编码:邮件通知写死在add_user里。老板说“用户注册要加短信提醒”,阿P就得改UserManager代码。万一改坏了其他功能?

  2. 重复代码:秘籍添加也要通知?阿P得在SecretManager里再复制粘贴一遍通知代码?太蠢!

  3. 紧耦合:用户管理、秘籍管理和通知方式死死绑在一起,像一团乱麻。想换个通知服务?牵一发动全身!

阿P感觉头大如斗,需求像怪兽一样朝他咆哮。这时,技术大牛“扫地僧”师傅出现了。

第一式:【观察者模式】 - 消息灵通的“江湖广播站”

“阿P啊”,扫地僧师傅笑眯眯地说,“你这通知方式,像小贩沿街叫卖,累死个人。咱们搞个‘江湖广播站’(发布-订阅模型)!”

核心思想:

  • 主题 (Subject):发生事情的地方(比如新用户注册、新秘籍上架)。它只负责喊:“喂!有情况啦!”

  • 观察者 (Observer):关心这个事情的人或模块(比如邮件服务、短信服务、APP推送服务)。它们提前在“广播站”登记:“我对新用户注册感兴趣!” 或者 “我对新秘籍上架感兴趣!”

  • 解耦:主题完全不知道有哪些具体的观察者,也不关心它们怎么处理。它只管喊。观察者自己决定要不要听,听到后自己干活

相关文章:

  • Element表格表头合并技巧
  • 【提示工程】Prompt Engineering完全指南:从理论到实践
  • 基于split-Bregman算法的L1正则化matlab仿真,对比GRSR算法
  • 汽车毫米波雷达增强感知:基于相干扩展和高级 IAA 的超分辨率距离和角度估计.
  • day039-nginx配置补充
  • 【机器学习】数学基础——标量
  • 基于Vue.js的图书管理系统前端界面设计
  • 【Android】am命令
  • 安卓jetpack compose学习笔记-Navigation基础学习
  • Vite 原理深入剖析
  • C语言Array数组 - 完整指南与练习题
  • LLM存储记忆功能之BaseChatMemory实战指南
  • 线程池异步处理
  • 经典新生:我如何用 AI 重制 40 款益智游戏
  • 数据结构学习——树的储存结构
  • 深度学习:PyTorch人工神经网络优化方法分享(2)
  • C++ 第二阶段:类与对象 - 第三节:成员函数与访问权限
  • 在windows上使用file命令
  • Flink SQL Connector Kafka 核心参数全解析与实战指南
  • linux----------------进程VS线程
  • 平面设计做画册用网站/产品推广网站哪个好
  • 基于WEB的企业网站开发 开题报告/威海seo
  • 网站建设明细价单/南京seo排名优化公司
  • wordpress多人聊天室/宿州百度seo排名软件
  • 建设报名系统网站/百度一下电脑版首页网址
  • wordpress插件安装本地安装教程/众志seo