Python: Visitor Pattern
GeovinDuVisitor.py
# 访问者模式 Visitor Pattern GeovinDuVistitor.py class Courses_At_GFG: def accept(self, visitor): visitor.visit(self) def teaching(self, visitor): print(self, "教授於 ", visitor) def studying(self, visitor): print(self, "學習於 ", visitor) def __str__(self): return self.__class__.__name__ """Concrete Courses_At_GFG class: Classes being visited.""" class SDE(Courses_At_GFG): pass class STL(Courses_At_GFG): pass class DSA(Courses_At_GFG): pass """ Abstract Visitor class for Concrete Visitor classes: method defined in this class will be inherited by all Concrete Visitor classes.""" class Visitor: def __str__(self): return self.__class__.__name__ class Instructor(Visitor): def visit(self, crop): crop.teaching(self) class Student(Visitor): def visit(self, crop): crop.studying(self) # 二類 class Item(): """Visitable class""" def accept(self): pass class Shirt(Item): def __init__(self, price, size): self.price = price self.size = size def get_price(self): return self.price def get_size(self): return self.size def accept(self, visitor): return visitor.visit(self) class Book(Item): def __init__(self, cost, genre): self.price = cost self.genre = genre def get_price(self): return self.price def get_genre(self): return self.genre def accept(self, visitor): return visitor.visit(self) class Visitor(): """Abstract Vistor Class""" def visit(self, item): pass class CartVisitor(Visitor): def visit(self, item): if isinstance(item, Book): cost = item.get_price() print("书的类型: {}, 费用 = ${}".format(item.get_genre(), cost)) return cost elif isinstance(item, Shirt): cost = item.get_price() print("衬衫,尺寸{} 费用 = ${}".format(item.get_size(), cost)) return cost def calculate_price(items): visitor = CartVisitor() sum = 0 for item in items: sum = sum + item.accept(visitor) return sum
main.py 调用
# 访问者模式 Visitor Pattern sde = GeovinDuVisitor.SDE() stl = GeovinDuVisitor.STL() dsa = GeovinDuVisitor.DSA() """Creating Visitors""" instructor = GeovinDuVisitor.Instructor() student = GeovinDuVisitor.Student() """Visitors visiting courses""" sde.accept(instructor) sde.accept(student) stl.accept(instructor) stl.accept(student) dsa.accept(instructor) dsa.accept(student) items = [ GeovinDuVisitor.Shirt(10, "XL"), GeovinDuVisitor.Shirt(15, "XXL"), GeovinDuVisitor.Book(20, "虚构小说"), GeovinDuVisitor.Book(100, "自助"), ] total = GeovinDuVisitor.calculate_price(items) print("涂聚文所购总成本 = ${}".format(total))
输出:
SDE 教授於 Instructor SDE 學習於 Student STL 教授於 Instructor STL 學習於 Student DSA 教授於 Instructor DSA 學習於 Student 衬衫,尺寸XL 费用 = $10 衬衫,尺寸XXL 费用 = $15 书的类型: 虚构小说, 费用 = $20 书的类型: 自助, 费用 = $100 涂聚文所购总成本 = $145
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)