定义
作用于对象结构,在不改变原对象的前提下,定义新操作。
直接上代码
原对象接口
public abstract class ComputerFace {
public abstract void play();
public void accept(Visitor visitor){
visitor.visit(this);
}
}
public class ComputerHP extends ComputerFace{
public void play(){
System.out.println("HP电脑玩吃鸡");
};
}
public class ComputerPG extends ComputerFace{
public void play(){
System.out.println("MC电脑玩吃鸡");
};
}
访问者接口
public interface Visitor {
public void visit(ComputerFace computerFace);
}
public class VisitorWork implements Visitor {
/**
* 增强
* @param computerFace
*/
@Override
public void visit(ComputerFace computerFace) {
computerFace.play();
System.out.println("XX电脑支持工作");
}
}
public class EnhanceComputer {
List<ComputerFace> computerFaceList=new ArrayList<>();
public void add(ComputerFace computerFace){
computerFaceList.add(computerFace);
}
public void enhance(Visitor visitor) {
if (!computerFaceList.isEmpty()){
computerFaceList.forEach(computerFace -> computerFace.accept(visitor));
}
}
}
测试
@Test
void visitTest(){
EnhanceComputer enhanceComputer = new EnhanceComputer();
//需要增强的类结构
//ComputerHP computerHP = new ComputerHP();
ComputerPG computerPG = new ComputerPG();
enhanceComputer.add(computerPG);
//访问者--增强者
VisitorWork visitorWork = new VisitorWork();
enhanceComputer.enhance(visitorWork);
}
总结
1.关键代码:在数据基础类里面有一个方法接受访问者,将自身引用传入访问者。
2.二次分发:第一次EnhanceComputer.enhance,
第二次 public void accept(Visitor visitor){
visitor.visit(this);
}
3.对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作;