访问者模式是一种行为设计模式,它允许您在不修改对象结构的情况下,向对象结构中的元素添加新的操作。这通常用于解决对象结构中元素类型多变,但操作类型相对稳定的问题。在访问者模式中,我们有一个访问者接口和多个具体的元素类,每个元素类都可以接受访问者的访问。以下是在 Java 中实现访问者模式的一般步骤:
-
创建一个访问者接口(Visitor):该接口定义了对不同元素执行的访问操作。
-
创建多个具体元素类(ConcreteElement):这些类表示对象结构中的不同元素,并实现了接受访问者访问的方法。
-
创建一个对象结构类(ObjectStructure):这个类维护一个元素的集合,并允许访问者访问这些元素。
-
创建具体访问者类(ConcreteVisitor):这些类实现了访问者接口,并定义了对具体元素的访问操作。
现在,让我们通过一个示例来实现访问者模式。假设我们有一个图形(Shape)类层次结构,包括圆形(Circle)和矩形(Rectangle)等不同的形状,并且我们希望能够计算它们的面积和周长:
// 步骤 1: 创建访问者接口
interface ShapeVisitor {
void visitCircle(Circle circle);
void visitRectangle(Rectangle rectangle);
}
// 步骤 2: 创建具体元素类
abstract class Shape {
abstract void accept(ShapeVisitor visitor);
}
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
@Override
void accept(ShapeVisitor visitor) {
visitor.visitCircle(this);
}
}
class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double getWidth() {
return width;
}
public double getHeight() {
return height;
}
@Override
void accept(ShapeVisitor visitor) {
visitor.visitRectangle(this);
}
}
// 步骤 3: 创建对象结构类
class Drawing {
private List<Shape> shapes = new ArrayList<>();
public void addShape(Shape shape) {
shapes.add(shape);
}
public void accept(ShapeVisitor visitor) {
for (Shape shape : shapes) {
shape.accept(visitor);
}
}
}
// 步骤 4: 创建具体访问者类
class AreaCalculator implements ShapeVisitor {
private double totalArea = 0;
@Override
public void visitCircle(Circle circle) {
double area = Math.PI * circle.getRadius() * circle.getRadius();
totalArea += area;
}
@Override
public void visitRectangle(Rectangle rectangle) {
double area = rectangle.getWidth() * rectangle.getHeight();
totalArea += area;
}
public double getTotalArea() {
return totalArea;
}
}
class PerimeterCalculator implements ShapeVisitor {
private double totalPerimeter = 0;
@Override
public void visitCircle(Circle circle) {
double perimeter = 2 * Math.PI * circle.getRadius();
totalPerimeter += perimeter;
}
@Override
public void visitRectangle(Rectangle rectangle) {
double perimeter = 2 * (rectangle.getWidth() + rectangle.getHeight());
totalPerimeter += perimeter;
}
public double getTotalPerimeter() {
return totalPerimeter;
}
}
// 示例
public class Main {
public static void main(String[] args) {
Drawing drawing = new Drawing();
drawing.addShape(new Circle(5.0));
drawing.addShape(new Rectangle(3.0, 4.0));
AreaCalculator areaCalculator = new AreaCalculator();
drawing.accept(areaCalculator);
System.out.println("总面积:" + areaCalculator.getTotalArea());
PerimeterCalculator perimeterCalculator = new PerimeterCalculator();
drawing.accept(perimeterCalculator);
System.out.println("总周长:" + perimeterCalculator.getTotalPerimeter());
}
}
在这个示例中,我们定义了一个访问者接口 ShapeVisitor
,然后创建了具体元素类 Circle
和 Rectangle
,它们都实现了 accept
方法以接受访问者。对象结构类 Drawing
维护了一个形状列表,并允许访问者访问这些形状。我们还创建了两个具体访问者类 AreaCalculator
和 PerimeterCalculator
,分别用于计算形状的面积和周长。文章来源:https://www.toymoban.com/news/detail-703399.html
通过访问者模式,我们可以轻松地添加新的访问者来执行不同的操作,而无需修改现有的元素类。这使得代码更加灵活和可维护。文章来源地址https://www.toymoban.com/news/detail-703399.html
到了这里,关于java 实现访问者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!