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. 注意编程规范。

 

 

posted @ 2024-11-27 08:23  The-rich  阅读(26)  评论(0)    收藏  举报