设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 访问者模式(Visitor) - Java实现

马阳曦
2023-12-01

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 访问者模式(Visitor)
访问者:表示一个作用于某对象结构中的各元素的操作。可以在不改变各元素类的前提下定义作用于这些元素的新操作。

一、说明:
1、IElement 被访问对象.元素(接口);
2、ElementA 被访问对象.元素.实现类;
3、ElementB 被访问对象.元素.实现类;
4、IVisitor 访问者(接口);
5、Visitor 访问者.实现类;
6、ObjectStructure 被访问者对象.角色(拥有元素)。

二、Java实现,代码如下:
1、IElement

package com.java.designPattern.visitor;

/**
 * 被访问对象.元素
 *
 */
public interface IElement {

    public void accept(IVisitor visitor);

    public void doSomething();

}

2、ElementA

package com.java.designPattern.visitor;

/**
 * 被访问对象.元素.实现类
 *
 */
public class ElementA implements IElement {

    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    @Override
    public void doSomething() {
        System.out.println(this.getClass().getSimpleName() + " do something !");
    }

}

3、ElementB

package com.java.designPattern.visitor;

/**
 * 被访问对象.元素.实现类
 *
 */
public class ElementB implements IElement {

    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }

    @Override
    public void doSomething() {
        System.out.println(this.getClass().getSimpleName() + " do something !");
    }

}

4、IVisitor

package com.java.designPattern.visitor;

/**
 * 访问者
 *
 */
public interface IVisitor {

    public void visit(IElement element);

}

5、Visitor

package com.java.designPattern.visitor;

/**
 * 访问者.实现类
 *
 */
public class Visitor implements IVisitor {

    @Override
    public void visit(IElement element) {
        System.out.println(this.getClass().getSimpleName() + " operate " + element.getClass().getSimpleName());
        element.doSomething();
    }

}

6、ObjectStructure

package com.java.designPattern.visitor;

import java.util.ArrayList;
import java.util.List;

/**
 * 被访问者对象.角色
 *
 */
public class ObjectStructure {

    private List<IElement> list = new ArrayList<IElement>();

    public void addElement(IElement element) {
        list.add(element);
    }

    public void removeElement(IElement element) {
        list.remove(element);
    }

    public void acceptVisitor(IVisitor visitor) {
        for (IElement element : list) {
            element.accept(visitor);
        }
    }

}

7、Test

package com.java.designPattern.visitor;

/**
 * 测试类
 *
 */
public class Test {

    public static void main(String[] args) {
        ObjectStructure obj = new ObjectStructure();
        obj.addElement(new ElementA());
        obj.addElement(new ElementB());

        obj.acceptVisitor(new Visitor());
    }

}

输出:
Visitor operate ElementA
ElementA do something !
Visitor operate ElementB
ElementB do something !

 类似资料: