JAVA 设计模式 访问者模式

时间:2024-04-24 21:36:33

用途


访问者模式 (Visitor)
表示一个作用于某对象结构中的各元素的操作。
它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式是一种行为型模式
用途

aaarticlea/png;base64,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" alt="" />

图-访问者模式结构图

Visitor : 为该对象结构中 ConcreteElement 的每一个类声明一个 Visit 操作。
abstract class Visitor {

    public abstract void VisitConcreteElementA(ConcreteElementA elementA);

    public abstract void VisitConcreteElementB(ConcreteElementB elementB);

}

ConcreteVisitor : 实现每个由 Visitor 声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。

class ConcreteVisitor1 extends Visitor {

    @Override

    public void VisitConcreteElementA(ConcreteElementA elementA) {

        System.out.println(this.getClass().getName() + " 访问 " + elementA.getClass().getName());

    }

    @Override

    public void VisitConcreteElementB(ConcreteElementB elementB) {

        System.out.println(this.getClass().getName() + " 访问 " + elementB.getClass().getName());

    }

}

class ConcreteVisitor2 extends Visitor {

    @Override

    public void VisitConcreteElementA(ConcreteElementA elementA) {

        System.out.println(this.getClass().getName() + " 访问 " + elementA.getClass().getName());

    }

    @Override

    public void VisitConcreteElementB(ConcreteElementB elementB) {

        System.out.println(this.getClass().getName() + " 访问 " + elementB.getClass().getName());

    }

}

Element : 定义一个Accpet操作,它以一个访问者为参数。

abstract class Element {

    public abstract void Accept(Visitor visitor);

}

ConcreteElement : 实现 Element 声明的 Accept 操作。

class ConcreteElementA extends Element {

    @Override

    public void Accept(Visitor visitor) {

        visitor.VisitConcreteElementA(this);

    }

}

class ConcreteElementB extends Element {

    @Override

    public void Accept(Visitor visitor) {

        visitor.VisitConcreteElementB(this);

    }

}

ObjectStructure : 可以枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。

class ObjectStructure {

    private List<Element> elements = new ArrayList<Element>();

    

    public void Attach(Element element) {

        elements.add(element);

    }

    

    public void Detach(Element element) {

        elements.remove(element);

    }

    

    public void Accept(Visitor visitor) {

        for (Element elem : elements) {

            elem.Accept(visitor);

        }

    }

}

测试代码

JAVA 设计模式 访问者模式JAVA 设计模式 访问者模式
public class VisitorPattern {
    public static void main(String[] args) {
        ObjectStructure o = new ObjectStructure();
        o.Attach(new ConcreteElementA());
        o.Attach(new ConcreteElementB());
        
        ConcreteVisitor1 v1 = new ConcreteVisitor1();
        ConcreteVisitor2 v2 = new ConcreteVisitor2();
        
        o.Accept(v1);
        o.Accept(v2);
    }
}

运行结果

JAVA 设计模式 访问者模式JAVA 设计模式 访问者模式
ConcreteVisitor1 访问 ConcreteElementA
ConcreteVisitor1 访问 ConcreteElementB
ConcreteVisitor2 访问 ConcreteElementA
ConcreteVisitor2 访问 ConcreteElementB
推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》

《HeadFirst设计模式》