第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录
1 核心思想
封装一些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
2. UML类图
3. 框架代码
from abc import ABC,abstractmethod
class Visitor:
@abstractmethod
def visitElementImplA(self,element):
pass
@abstractmethod
def visitElementImplB(self,element):
pass
class VisitorImplA(Visitor):
def visitElementImplA(self, element):
print(f"{element.__class__.__name__}被{self.__class__.__name__}访问。。。")
def visitElementImplB(self, element):
print(f"{element.__class__.__name__}被{self.__class__.__name__}访问。。。")
class VisitorImplB(Visitor):
def visitElementImplA(self, element):
print(f"{element.__class__.__name__}被{self.__class__.__name__}访问。。。")
def visitElementImplB(self, element):
print(f"{element.__class__.__name__}被{self.__class__.__name__}访问。。。")
class Element(ABC):
@abstractmethod
def accept(self, visitor:Visitor):
pass
class ElementImplA(Element):
def accept(self, visitor: Visitor):
visitor.visitElementImplA(self)
class ElementImplB(Element):
def accept(self, visitor: Visitor):
visitor.visitElementImplB(self)
class ObjectStructure:
def __init__(self, elements=[]) -> None:
self._elements = elements
def addElement(self,element:Element):
self._elements.append(element)
def removeElement(self, element:Element):
self._elements.remove(element)
def accept(self, visitor: Visitor):
for element in self._elements:
element.accept(visitor)
if __name__ == "__main__":
objectStructure = ObjectStructure([])
objectStructure.addElement(ElementImplA())
objectStructure.addElement(ElementImplB())
visitorA = VisitorImplA()
visitorB = VisitorImplB()
objectStructure.accept(visitorA)
objectStructure.accept(visitorB)
4. 模型说明
4.1 设计要点
访问模式中主要有三个角色,在设计访问模式时要找到并区分这些角色。
- 访问者(Visitor):负责对数据节点进行访问和操作。
- 元素(Element):即要被操作的数据对象,一般种类是固定不变的。
- 对象结构(ObjectStructure):数据结构的管理类,也是数据对象的一个容器,可遍历容器内的所有元素。
4.2 优缺点
- 优点
- 将数据和操作(算法)分离,降低了耦合度。将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个的元素类中,类的职责更加清晰。
- 增加新的访问操作很方便。使用访问模式,增加新的访问操作就意味着增加一个新的具体访问者类,实现简单,无须修改源代码,符合“开闭原则”。
- 让用户能够在不修改现有元素类层次结构的情况下,定义作用于该层次结构的操作。
- 缺点
- 增加新的元素类很困难。在访问模式中,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”的要求。
- 破坏数据对象的封装性。访问模式要求访问者对象能够访问并调用每一个元素的操作细节,这意味着元素对象有时候必须暴露一些自己的内部操作和内部状态,否则无法供访问者访问。
5. 应用场景
- 对象结构中包含的对象类型比较少,而且这些类需求比较固定,很少改变,但经常需要在此对象结构上定义新的操作。
- 一个对象结构包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作。在访问模式中针对每一种具体的类型都提供了一个访问操作,不同类型的对象可以有不同的访问操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。访问模式使得我们可以将相关的访问操作集中起来定义在访问者类中,对象结构可以被多个不同的访问者类所使用,将对象本身与对象的访问操作分离。