设计模式 | 访问者模式

130 阅读1分钟

定义

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新操作。

使用场景

  • 对象的结构比较稳定,但经常需要在此对象结构上定义新的操作。
  • 需要对一个对象结构中的对象进行很多不同的且并不相关的操作,而需要避免这些操作污染这些对象的类,也不希望在增加新操作时修改这些类。

Java 代码示例

public abstract class Staff {
    public abstract void accept(Visitor visitor);
}

public interface Visitor {
    void visit(Engineer engineer);
    void visit(Manager manager);
}

public class Engineer extends Staff {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

public class Manager extends Staff {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

public class CeoVisitor implements Visitor {
    @Override
    public void visit(Engineer engineer) {

    }

    @Override
    public void visit(Manager manager) {

    }
}

public class CtoVisitor implements Visitor {
    @Override
    public void visit(Engineer engineer) {

    }

    @Override
    public void visit(Manager manager) {

    }
}

public class Client {
    public static void main(String[] args) {
        List<Staff> staffs = new ArrayList<>();
        staffs.add(new Engineer());
        staffs.add(new Manager());

        CeoVisitor ceo = new CeoVisitor();
        CtoVisitor cto = new CtoVisitor();

        for (Staff staff : staffs) {
            staff.accept(ceo);
            staff.accept(cto);
        }
    }
}