【Python OOP Diary 3】高级特性与设计模式练习题(七至十三)
Python面向对象编程进阶:高级特性与设计模式练习题
已经掌握了OOP基础?现在让我们挑战更高级的题目,学习特殊方法、设计模式、组合关系等进阶概念!
题目七:魔术方法练习 - 向量类
问题描述
创建一个Vector类,实现向量的基本运算。要求使用Python的魔术方法(特殊方法)来支持数学运算、比较运算和内置函数。
输入格式
程序需要支持向量创建和多种运算:
- 创建向量:Vector(x, y, z)
- 向量加法:v1 + v2
- 向量减法:v1 - v2
- 点乘:v1 * v2
- 数乘:k * v或v * k
- 求模:abs(v)
- 字符串表示:str(v)
- 比较:v1 == v2
输出格式
根据运算输出相应结果。
样例输入
v1 = Vector(1, 2, 3)
v2 = Vector(4, 5, 6)
print(v1 + v2)
print(v1 - v2)
print(v1 * v2)  # 点乘
print(2 * v1)
print(abs(v1))
print(v1)
print(v1 == Vector(1, 2, 3))
样例输出
Vector(5, 7, 9)
Vector(-3, -3, -3)
32
Vector(2, 4, 6)
3.74
Vector(1, 2, 3)
True
要求
- 实现以下魔术方法:
- __init__,- __repr__,- __str__
- __add__,- __sub__,- __mul__
- __rmul__(右乘)
- __abs__,- __eq__
 
- 点乘返回标量,数乘返回向量
- 模长计算使用欧几里得距离
解题思路
- 使用魔术方法让类支持Python内置运算符
- 注意区分点乘和数乘的逻辑
- 实现__rmul__支持标量左乘
题目八:组合关系练习 - 电脑组装系统
问题描述
创建一个电脑组装系统,使用组合关系(Composition)来构建复杂的对象。电脑由CPU、内存、硬盘等组件组成。
输入格式
多行输入,每行一个命令:
- add_cpu 型号 频率:添加CPU
- add_memory 容量 类型:添加内存
- add_disk 容量 类型:添加硬盘
- assemble 电脑名:组装电脑
- show 电脑名:显示电脑配置
- benchmark 电脑名:性能测试
- exit:退出
输出格式
根据命令输出相应结果。
样例输入
add_cpu i7-12700K 3.6
add_memory 16 DDR4
add_disk 1024 SSD
assemble MyPC
show MyPC
benchmark MyPC
exit
样例输出
电脑 'MyPC' 组装完成!
电脑配置:
CPU: i7-12700K (3.6GHz)
内存: 16GB DDR4
硬盘: 1024GB SSD
性能得分: 8750
要求
- 使用组合关系:电脑"拥有"各个组件
- 每个组件都是独立的类
- 性能得分基于组件参数计算
- 支持同一电脑添加多个内存条和硬盘
解题思路
- 创建组件类:CPU,Memory,Disk
- 电脑类包含组件对象作为属性
- 使用列表管理多个同类组件
- 性能计算考虑各组件的协同效应
题目九:观察者模式练习 - 股票交易系统
问题描述
实现一个股票交易系统,使用观察者模式(Observer Pattern)。当股票价格变化时,自动通知所有观察者(投资者)。
输入格式
多行输入,每行一个命令:
- add_stock 代码 名称 初始价格:添加股票
- add_investor 姓名:添加投资者
- subscribe 投资者 股票:订阅股票
- set_price 股票 新价格:设置股票价格
- show_investors 股票:显示订阅者
- exit:退出
输出格式
价格变化时自动通知所有订阅者。
样例输入
add_stock AAPL 苹果 150
add_stock TSLA 特斯拉 200
add_investor 张三
add_investor 李四
subscribe 张三 AAPL
subscribe 李四 AAPL
subscribe 李四 TSLA
set_price AAPL 155
set_price TSLA 190
样例输出
通知 张三: AAPL(苹果) 价格变化: 150.00 -> 155.00
通知 李四: AAPL(苹果) 价格变化: 150.00 -> 155.00
通知 李四: TSLA(特斯拉) 价格变化: 200.00 -> 190.00
要求
- 实现观察者模式:主题(股票)和观察者(投资者)
- 支持一对多的通知关系
- 投资者可以订阅多个股票
- 价格变化时自动通知所有相关投资者
解题思路
- 主题接口:添加、删除、通知观察者
- 观察者接口:接收更新
- 股票作为具体主题,投资者作为具体观察者
- 使用字典管理订阅关系
题目十:工厂模式练习 - 图形绘制系统
问题描述
创建一个图形绘制系统,使用工厂模式(Factory Pattern)来创建不同类型的图形对象。
输入格式
多行输入,每行描述要创建的图形:
- circle 半径 x y:创建圆形
- rectangle 长 宽 x y:创建矩形
- triangle 边1 边2 边3 x y:创建三角形
- draw all:绘制所有图形
- area all:计算总面积
- exit:退出
输出格式
根据命令输出绘制结果或计算信息。
样例输入
circle 5 10 10
rectangle 8 6 20 20
triangle 3 4 5 30 30
draw all
area all
exit
样例输出
在(10,10)绘制圆形(半径=5)
在(20,20)绘制矩形(8x6)
在(30,30)绘制三角形(3,4,5)
总面积: 110.27
要求
- 使用工厂模式创建图形对象
- 每个图形都有draw()和area()方法
- 支持多种图形类型
- 统一管理所有创建的图形
解题思路
- 图形工厂类根据输入参数创建具体图形
- 基类定义统一接口
- 具体图形类实现具体逻辑
- 使用列表管理所有图形对象
题目十一:装饰器模式练习 - 咖啡订单系统
问题描述
实现一个咖啡订单系统,使用装饰器模式(Decorator Pattern)来动态添加配料。基础咖啡可以添加牛奶、糖、奶油等配料,每种配料都会影响价格和描述。
输入格式
多行输入,每行一个命令:
- order 咖啡类型:订购基础咖啡
- add 配料:添加配料
- show:显示当前订单
- price:计算总价
- new_order:开始新订单
- exit:退出
样例输入
order 拿铁
add 牛奶
add 糖
show
price
new_order
order 美式
add 奶油
show
price
exit
样例输出
拿铁 + 牛奶 + 糖
价格: 32.00
美式 + 奶油
价格: 28.00
要求
- 使用装饰器模式动态添加功能
- 每种配料都是一个装饰器
- 配料可以任意组合
- 价格自动累加计算
解题思路
- 组件接口:get_description(),cost()
- 具体组件:各种基础咖啡
- 装饰器基类:继承组件接口
- 具体装饰器:各种配料
题目十二:策略模式练习 - 数据压缩系统
问题描述
创建一个数据压缩系统,使用策略模式(Strategy Pattern)来支持不同的压缩算法。用户可以选择使用ZIP、RAR或7Z算法来压缩文件。
输入格式
多行输入,每行一个命令:
- set_algorithm 算法:设置压缩算法
- compress 文件名:压缩文件
- decompress 文件名:解压文件
- show_algorithms:显示可用算法
- exit:退出
输出格式
根据命令输出压缩结果。
样例输入
show_algorithms
set_algorithm ZIP
compress document.txt
set_algorithm RAR
compress image.jpg
decompress archive.rar
exit
样例输出
可用算法: ZIP, RAR, 7Z
使用ZIP算法压缩: document.txt -> document.zip
使用RAR算法压缩: image.jpg -> image.rar
使用RAR算法解压: archive.rar -> extracted/
要求
- 使用策略模式封装压缩算法
- 可以在运行时切换算法
- 支持多种压缩格式
- 统一的压缩/解压接口
解题思路
- 策略接口:compress(),decompress()
- 具体策略:各种压缩算法实现
- 上下文类:维护当前策略引用
- 客户端可以动态切换策略
题目十三:迭代器模式练习 - 图书目录系统
问题描述
创建一个图书目录系统,使用迭代器模式(Iterator Pattern)来遍历图书集合。支持按不同方式遍历:顺序遍历、按分类过滤、按作者过滤等。
输入格式
多行输入,每行一个命令:
- add_book 书名 作者 分类:添加图书
- list_books:顺序列出所有图书
- list_by_category 分类:按分类列出图书
- list_by_author 作者:按作者列出图书
- search 关键词:搜索图书
- exit:退出
输出格式
根据遍历方式输出图书列表。
样例输入
add_book Python编程 张三 编程
add_book 算法导论 李四 计算机科学
add_book 设计模式 王五 编程
list_books
list_by_category 编程
search Python
exit
样例输出
所有图书:
1. Python编程 - 张三 [编程]
2. 算法导论 - 李四 [计算机科学]
3. 设计模式 - 王五 [编程]编程类图书:
1. Python编程 - 张三
2. 设计模式 - 王五搜索 'Python':
Python编程 - 张三 [编程]
要求
- 使用迭代器模式提供多种遍历方式
- 迭代器接口:has_next(),next()
- 聚合接口:create_iterator()
- 支持多种迭代策略
解题思路
- 迭代器接口定义遍历方法
- 具体迭代器实现不同遍历逻辑
- 聚合类提供创建迭代器的方法
- 客户端通过迭代器访问元素,不暴露内部结构
学习建议
- 理解模式意图:每个设计模式解决特定类型的问题
- 对比不同模式:理解各种模式的适用场景和区别
- 实际应用思考:思考这些模式在真实项目中的应用
- 组合使用模式:在实际项目中,经常需要组合使用多个模式
设计模式总结
通过这些题目,你将掌握:
- 创建型模式:工厂模式(对象创建)
- 结构型模式:装饰器模式(功能扩展)、组合模式(部分-整体)
- 行为型模式:观察者模式(事件通知)、策略模式(算法封装)、迭代器模式(集合遍历)
这些高级OOP概念和设计模式将帮助你构建更加灵活、可维护和可扩展的软件系统。
