访问者模式

访问者模式UML类图

访问者模式UML类图

访问者模式java实现

/**
* Visitor interface.
*/
public interface UnitVisitor {

void visitSoldier(Soldier soldier);

void visitSergeant(Sergeant sergeant);

void visitCommander(Commander commander);

}

/**
* CommanderVisitor.
指挥官访客
*/
public class CommanderVisitor implements UnitVisitor {

private static final Logger LOGGER = LoggerFactory.getLogger(CommanderVisitor.class);

@Override
public void visitSoldier(Soldier soldier) {
// Do nothing
}

@Override
public void visitSergeant(Sergeant sergeant) {
// Do nothing
}

@Override
public void visitCommander(Commander commander) {
LOGGER.info("Good to see you {}", commander);
}
}

/**
* SergeantVisitor.
中士访客
*/
public class SergeantVisitor implements UnitVisitor {

private static final Logger LOGGER = LoggerFactory.getLogger(SergeantVisitor.class);

@Override
public void visitSoldier(Soldier soldier) {
// Do nothing
}

@Override
public void visitSergeant(Sergeant sergeant) {
LOGGER.info("Hello {}", sergeant);
}

@Override
public void visitCommander(Commander commander) {
// Do nothing
}
}

/**
* SoldierVisitor.
士兵访客
*/
public class SoldierVisitor implements UnitVisitor {

private static final Logger LOGGER = LoggerFactory.getLogger(SoldierVisitor.class);

@Override
public void visitSoldier(Soldier soldier) {
LOGGER.info("Greetings {}", soldier);
}

@Override
public void visitSergeant(Sergeant sergeant) {
// Do nothing
}

@Override
public void visitCommander(Commander commander) {
// Do nothing
}
}

/**
* Interface for the nodes in hierarchy.
*/
public abstract class Unit {

private Unit[] children;

public Unit(Unit... children) {
this.children = children;
}

/**
* Accept visitor.
*/
public void accept(UnitVisitor visitor) {
Arrays.stream(children).forEach(child -> child.accept(visitor));
}
}

/**
* Commander.
*/
public class Commander extends Unit {

public Commander(Unit... children) {
super(children);
}

@Override
public void accept(UnitVisitor visitor) {
visitor.visitCommander(this);
super.accept(visitor);
}

@Override
public String toString() {
return "commander";
}
}

/**
* Sergeant.
*/
public class Sergeant extends Unit {

public Sergeant(Unit... children) {
super(children);
}

@Override
public void accept(UnitVisitor visitor) {
visitor.visitSergeant(this);
super.accept(visitor);
}

@Override
public String toString() {
return "sergeant";
}
}

/**
* Soldier.
*/
public class Soldier extends Unit {

public Soldier(Unit... children) {
super(children);
}

@Override
public void accept(UnitVisitor visitor) {
visitor.visitSoldier(this);
super.accept(visitor);
}

@Override
public String toString() {
return "soldier";
}
}

/**
* <p>Visitor pattern defines mechanism to apply operations on nodes in hierarchy. New operations
* can be added without altering the node interface.</p>
*
* <p>In this example there is a unit hierarchy beginning from {@link Commander}. This hierarchy is
* traversed by visitors. {@link SoldierVisitor} applies its operation on {@link Soldier}s, {@link
* SergeantVisitor} on {@link Sergeant}s and so on.</p>
<p>访问者模式定义了将操作应用于层次结构中的节点的机制。 可以添加新操作,而无需更改节点接口。</ p>
<p>在此示例中,从{@link Commander}开始有一个单元层次结构。 访客遍历此层次结构。 {@link SoldierVisitor}在{@link Soldier}上应用其操作,在{@link Sergeant} s上使用{@link SergeantVisitor},依此类推。</ p>
*/
public class App {

/**
* Program entry point.
*
* @param args command line args
*/
public static void main(String[] args) {

var commander = new Commander(
new Sergeant(new Soldier(), new Soldier(), new Soldier()),
new Sergeant(new Soldier(), new Soldier(), new Soldier())
);
commander.accept(new SoldierVisitor());
commander.accept(new SergeantVisitor());
commander.accept(new CommanderVisitor());

}
}

项目实战

asm