5.12 访问者(Visitor)模式
核心思想:
访问者模式是一种将数据操作与数据结构分离的设计模式。它使得在不修改对象结构的情况下,能够增加新的操作。
结构:
访问者模式包含访问者(Visitor)、具体访问者(ConcreteVisitor)、元素(Element)、具体元素(ConcreteElement)、对象结构(ObjectStructure)以及一个可选的抽象访问者(Visitor接口或抽象类)。
应用场景:
当一个对象结构包含很多类,且希望在不修改这些类的情况下增加新的操作时。
当需要对一个对象结构中的对象进行很多不同的、不相关的操作时,应使用访问者模式将这些操作分离出来。
第六章 结构型模式6.1 代理(Proxy)模式
核心思想:
为其他对象提供一种代理以控制对这个对象的访问。
结构:
代理模式包含代理(Proxy)和真实主题(RealSubject)两个角色。代理对象持有对真实主题对象的引用,并在必要时将请求转发给真实主题对象。
应用场景:
远程代理:用于在不同地址空间(例如,通过网络)的对象之间实现分布式通信。
虚拟代理:用于创建开销很大的对象时,通过它来存放实例化需要很长时间的真实对象。
保护代理:用于控制对原始对象的访问权限。
智能引用:当一个对象被引用时,代理会自动处理一些附加任务,如计数引用次数等。
6.2 适配器(Adapter)模式
核心思想:
将一个类的接口转换成客户希望的另外一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。
结构:
适配器模式包含目标(Target)接口、适配者(Adaptee)类以及适配器(Adapter)类。适配器类将适配者的接口转换为目标接口。
应用场景:
当需要使用一个现有的类,但这个类的接口与所需接口不一致时。
当希望使用一个已经存在的子类,但该类所实现的接口与所需接口不一致时。
6.3 装饰(Decorator)模式
核心思想:
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
结构:
装饰模式包含抽象组件(Component)、具体组件(ConcreteComponent)以及装饰者(Decorator)等角色。装饰者持有一个指向抽象组件的引用,并可以在必要时将请求转发给被装饰的对象。
应用场景:
当需要为一个对象添加额外的功能,而这些功能又可以动态地撤销时。
当不能采用生成子类的方式进行扩展时,例如,由于类定义被隐藏或不可用。
6.4 桥接(Bridge)模式
核心思想:
将抽象部分与实现部分分离,使它们都可以独立地变化。
结构:
桥接模式包含抽象化(Abstraction)角色、实现化(Implementor)角色、抽象化实现(RefinedAbstraction)以及具体实现(ConcreteImplementor)等。
应用场景:
当需要在多个维度上变化时,可以使用桥接模式将这些维度分离出来。
当不希望使用继承或因为多层次继承导致系统类的个数急剧增加时,桥接模式是一个很好的选择。
6.5 外观(Facade)模式
核心思想:
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构:
外观模式包含一个外观(Facade)类以及多个子系统类。外观类为客户端提供了一个简单的接口,以访问子系统中的复杂功能。
应用场景:
当需要为一个复杂的子系统提供一个简单接口时。
当客户端与多个子系统之间存在大量的交互时,可以使用外观模式来简化这些交互。
核心思想:
访问者模式是一种将数据操作与数据结构分离的设计模式。它使得在不修改对象结构的情况下,能够增加新的操作。
结构:
访问者模式包含访问者(Visitor)、具体访问者(ConcreteVisitor)、元素(Element)、具体元素(ConcreteElement)、对象结构(ObjectStructure)以及一个可选的抽象访问者(Visitor接口或抽象类)。
应用场景:
当一个对象结构包含很多类,且希望在不修改这些类的情况下增加新的操作时。
当需要对一个对象结构中的对象进行很多不同的、不相关的操作时,应使用访问者模式将这些操作分离出来。
第六章 结构型模式6.1 代理(Proxy)模式
核心思想:
为其他对象提供一种代理以控制对这个对象的访问。
结构:
代理模式包含代理(Proxy)和真实主题(RealSubject)两个角色。代理对象持有对真实主题对象的引用,并在必要时将请求转发给真实主题对象。
应用场景:
远程代理:用于在不同地址空间(例如,通过网络)的对象之间实现分布式通信。
虚拟代理:用于创建开销很大的对象时,通过它来存放实例化需要很长时间的真实对象。
保护代理:用于控制对原始对象的访问权限。
智能引用:当一个对象被引用时,代理会自动处理一些附加任务,如计数引用次数等。
6.2 适配器(Adapter)模式
核心思想:
将一个类的接口转换成客户希望的另外一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。
结构:
适配器模式包含目标(Target)接口、适配者(Adaptee)类以及适配器(Adapter)类。适配器类将适配者的接口转换为目标接口。
应用场景:
当需要使用一个现有的类,但这个类的接口与所需接口不一致时。
当希望使用一个已经存在的子类,但该类所实现的接口与所需接口不一致时。
6.3 装饰(Decorator)模式
核心思想:
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
结构:
装饰模式包含抽象组件(Component)、具体组件(ConcreteComponent)以及装饰者(Decorator)等角色。装饰者持有一个指向抽象组件的引用,并可以在必要时将请求转发给被装饰的对象。
应用场景:
当需要为一个对象添加额外的功能,而这些功能又可以动态地撤销时。
当不能采用生成子类的方式进行扩展时,例如,由于类定义被隐藏或不可用。
6.4 桥接(Bridge)模式
核心思想:
将抽象部分与实现部分分离,使它们都可以独立地变化。
结构:
桥接模式包含抽象化(Abstraction)角色、实现化(Implementor)角色、抽象化实现(RefinedAbstraction)以及具体实现(ConcreteImplementor)等。
应用场景:
当需要在多个维度上变化时,可以使用桥接模式将这些维度分离出来。
当不希望使用继承或因为多层次继承导致系统类的个数急剧增加时,桥接模式是一个很好的选择。
6.5 外观(Facade)模式
核心思想:
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构:
外观模式包含一个外观(Facade)类以及多个子系统类。外观类为客户端提供了一个简单的接口,以访问子系统中的复杂功能。
应用场景:
当需要为一个复杂的子系统提供一个简单接口时。
当客户端与多个子系统之间存在大量的交互时,可以使用外观模式来简化这些交互。