11.1
实验 25:访问者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解访问者模式的动机,掌握该模式的结构;
2、能够利用访问者模式法解决实际问题。
[实验任务一]:打包员
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
实验要求:
1. 画出对应的类图;
2. 提交源代码;
from abc import ABC, abstractmethod
from typing import List
# 抽象访问者类
class Visitor(ABC):
@abstractmethod
def visitBook(self, book):
pass
@abstractmethod
def visitElectronics(self, electronics):
pass
@abstractmethod
def visitClothes(self, clothes):
pass
# 新增的访问购物车的抽象方法
@abstractmethod
def visitShoppingCart(self, shoppingCart):
pass
# 购物车类
class ShoppingCart:
def __init__(self):
self.items = []
def addItem(self, item):
self.items.append(item)
def removeItem(self, item):
self.items.remove(item)
def accept(self, visitor):
visitor.visitShoppingCart(self)
for item in self.items:
item.accept(visitor)
# 抽象商品类
class Item(ABC):
def __init__(self, name, price):
self.name = name
self.price = price
@abstractmethod
def accept(self, visitor):
pass
def getName(self):
return self.name
def getPrice(self):
return self.price
# 书籍类
class Book(Item):
def __init__(self, name, price, author):
super().__init__(name, price)
self.author = author
def accept(self, visitor):
visitor.visitBook(self)
def getAuthor(self):
return self.author
# 电子产品类
class Electronics(Item):
def __init__(self, name, price, brand):
super().__init__(name, price)
self.brand = brand
def accept(self, visitor):
visitor.visitElectronics(self)
def getBrand(self):
return self.brand
# 衣服类
class Clothes(Item):
def __init__(self, name, price, size, color):
super().__init__(name, price)
self.size = size
self.color = color
def accept(self, visitor):
visitor.visitClothes(self)
def getSize(self):
return self.size
def getColor(self):
return self.color
# 打包员类(具体访问者)
class Packer(Visitor):
def visitBook(self, book):
print(f"正在打包书籍:{book.getName()},作者:{book.getAuthor()}")
def visitElectronics(self, electronics):
print(f"正在打包电子产品:{electronics.getName()},品牌:{electronics.getBrand()}")
def visitClothes(self, clothes):
print(f"正在打包衣服:{clothes.getName()},尺寸:{clothes.getSize()},颜色:{clothes.getColor()}")
def visitShoppingCart(self, shoppingCart):
print("开始打包购物车中的商品...")
for item in shoppingCart.items:
item.accept(self)
if __name__ == "__main__":
shopping_cart = ShoppingCart()
book = Book("Python从入门到实践", 89.0, "Eric Matthes")
electronics = Electronics("iPhone 14", 7999.0, "Apple")
clothes = Clothes("T恤", 99.0, "M", "白色")
shopping_cart.addItem(book)
shopping_cart.addItem(electronics)
shopping_cart.addItem(clothes)
packer = Packer()
shopping_cart.accept(packer)
3. 注意编程规范。
浙公网安备 33010602011771号