定义:将作用于某种数据结构中的各元素的操作分离出来封装为独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。
使用场景:
结构:
举例场景:有一个房子,不同的租客来看房,对于房子的各个部分需要进行的操作(查看的地方)不同,但是房子的结构是固定的(卧室、厨房、卫生间)。示例代码如下:
public interface Element {
void accept(Visitor visitor);
}
public class BedRoomElement implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class KitchenElement implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class ToiletElement implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
//相当于对象结构类
public class House {
private List<Element> list=new ArrayList<>();
public void add(Element element){
list.add(element);
}
public void accept(Visitor visitor){
list.forEach(e->e.accept(visitor));
}
}
public interface Visitor {
void visit(BedRoomElement bedRoomElement);
void visit(KitchenElement kitchenElement);
void visit(ToiletElement toiletElement);
}
public class ConcreteVisitorA implements Visitor {
@Override
public void visit(BedRoomElement bedRoomElement) {
System.out.println("查看卧室采光");
}
@Override
public void visit(KitchenElement kitchenElement) {
System.out.println("查看厨房卫生");
}
@Override
public void visit(ToiletElement toiletElement) {
System.out.println("查看卫生间漏水");
}
}
public class ConcreteVisitorB implements Visitor {
@Override
public void visit(BedRoomElement bedRoomElement) {
System.out.println("查看卧室朝向");
}
@Override
public void visit(KitchenElement kitchenElement) {
System.out.println("查看厨房大小");
}
@Override
public void visit(ToiletElement toiletElement) {
System.out.println("查看卫生间卫生");
}
}
测试代码:
public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
House house=new House();
house.add(new BedRoomElement());
house.add(new KitchenElement());
house.add(new ToiletElement());
//租客A看房
Visitor visitor=new ConcreteVisitorA();
house.accept(visitor);
//租客B看房
Visitor visitorB=new ConcreteVisitorB();
house.accept(visitorB);
}
原文:https://www.cnblogs.com/javammc/p/14968038.html