访问者模式
文章目录
访问者模式的定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
简单来说就是,就是将算法与其所作用的对象隔离开来,在不对原有类做出太多改动的情况下将新的行为封装到访问者中。在此模式中,不变的是原有类的结构,变的是功能。
该模式中存在四种角色:
- 抽象访问者。定义以对象为参数的访问者方法。
- 具体访问者。实现不同对象的具体的访问者方法。
- 抽象元素。定义一个以访问者为参数的方法,用于接收访问者。
- 具体元素。实现接收方法。
classDiagram
class Visitor{
<<Interface>>
visit(ElementA)
visit(ElementB)
}
class ConcreteVisitor{
visit(ElementA)
visit(ElementB)
}
class Element{
<<Interface>>
accept(Visitor)
}
class ElementA{
accept(Visitor)
}
class ElementB{
accept(Visitor)
}
Element ..> Visitor
ConcreteVisitor ..|> Visitor : 实现
ElementA ..|> Element : 实现
ElementB ..|> Element : 实现
代码实现
//元素接口
public interface Shape {
// 传入访问者
String accept(Visitor visitor);
}
// 具体元素
@Data
@AllArgsConstructor
public class Dot implements Shape{
private int x;
private int y;
@Override
public String accept(Visitor visitor) {
return visitor.visitDot(this);
}
}
@Data
@AllArgsConstructor
public class Circle implements Shape{
private int x;
private int y;
private int radius;
@Override
public String accept(Visitor visitor) {
return visitor.visitCircle(this);
}
}
// 访问者接口
public interface Visitor {
// 定义访问的具体元素
String visitDot(Dot dot);
String visitCircle(Circle circle);
}
// 具体访问者
public class ConcreteVisitor implements Visitor {
@Override
public String visitDot(Dot dot) {
return String.format("dot:x(%s),y(%s) \n", dot.getX(), dot.getY());
}
@Override
public String visitCircle(Circle circle) {
return String.format("circle:x(%s),y(%s),radius(%s) \n", circle.getX(), circle.getY(), circle.getRadius());
}
public String export(Shape... shapes) {
StringBuilder sb = new StringBuilder();
for (Shape shape : shapes) {
sb.append(shape.accept(this));
}
return sb.toString();
}
}
// 客户端
ConcreteVisitor concreteVisitor = new ConcreteVisitor();
Dot dot = new Dot(1, 1);
Circle circle = new Circle(2, 2, 2);
System.out.println(concreteVisitor.export(dot, circle));
该模式的优点是在引入新行为时,不需要对原有类做出太多修改。
文章作者 梧桐碎梦
上次更新 2023-05-13 12:52:22