访问者模式

    xiaoxiao2022-07-02  94

    1.概述

    访问者模式(Visitor Pattern):表示一个作用于某个对象结构的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

    2.结构

    (1)Visitor(抽象访问者):抽象访问者为对象结构中每一个具体元素类声明一个访问操作,从这个操作的名称或参数类型大家可以清楚地知道需要访问的具体元素的类型,具体访问者需要实现这些操作方法,定义对这些元素的访问操作。

    (2)ConcreteVisitor(具体访问者):继承实现抽象访问者。

    (3)Element(抽象元素):一般为抽象类或接口,声明一个Accept()方法,用于接受访问者的访问操作,通常以一个抽象访问者作为参数。

    (4)ConcreteElement(具体元素):继承实现抽象元素。

    (5)ObjectStructure(对象结构):是一个元素的集合。

    3.实现

    using System.Collections.Generic; namespace Visitor { public abstract class Visitor { public abstract void Visit(ConcreteElementA elementA); public abstract void Visit(ConcreteElementB elementB); public void Visit(ConcreteElementC elementC) { //-- } } public class ConcreteVisitor : Visitor { public override void Visit(ConcreteElementA elementA) { //-- } public override void Visit(ConcreteElementB elementB) { //-- } } public interface Element { void Accept(Visitor visitor); } public class ConcreteElementA : Element { public void Accept(Visitor visitor) { visitor.Visit(this); } public void MethodA() { //-- } } public class ConcreteElementB : Element { public void Accept(Visitor visitor) { visitor.Visit(this); } } public class ConcreteElementC : Element { public void Accept(Visitor visitor) { visitor.Visit(this); } public void MethodC() { //-- } } public class ObjectStructure { private List<Element> elements = new List<Element>(); public void AddElement(Element element) { elements.Add(element); } public void RemoveElement(Element element) { elements.Remove(element); } public void Accept(Visitor visitor) { for (int i = 0; i < elements.Count; i++) { elements[1].Accept(visitor); } } } }

    4.优缺点

    (1)增加新的访问操作很方便,增加一个新的具体访问者类即可。

    (2)将有关元素的访问行为集中到一个访问者对象中,而不是分散在一个个元素中。类的职责更清晰有利于元素的复用。相同的对象结构可以供多个不同的访问者访问。

    (3)可以在不修改现有元素类层次结构下,定义作用于该层次结构的操作。

    (1)新增元素很困难。要在抽象访问者中新加抽象操作,每个具体访问者都要实现。

    (2)破坏封装。元素对象有时候需要暴露自己的内部操作和状态,否则无法供访问者访问。

    最新回复(0)