使用java實(shí)現(xiàn)的訪問者模式的示例,對訪問者模式的對象結(jié)構(gòu)和操作分離的思想摸不透徹,敲下代碼,加深印象
public class VisitorMode {
public static void main(String[] args) {
AeraShapeVisitor aeraShapeVisitor = new AeraShapeVisitor();
Shape circle = new Circle(10);
circle.accept(aeraShapeVisitor);
System.out.println("area = "+aeraShapeVisitor.getmArea());
PerimeterShapeVisitor perimeterShapeVisitor = new PerimeterShapeVisitor();
circle.accept(perimeterShapeVisitor);
System.out.println("perimeter = "+perimeterShapeVisitor.getmPerimeter());
Rectangle rectangle =new Rectangle(10,10);
rectangle.accept(aeraShapeVisitor);
System.out.println("area = "+aeraShapeVisitor.getmArea());
rectangle.accept(perimeterShapeVisitor);
System.out.println("perimeter = "+perimeterShapeVisitor.getmPerimeter());
}
private static interface ShapeVisitor{
void visitor(Circle circle);
void visitor(Rectangle circle);
}
private static class AeraShapeVisitor implements ShapeVisitor{
private double mArea;
@Override
public void visitor(Circle circle) {
mArea = Math.PI * circle.mRadius * circle.mRadius;
}
@Override
public void visitor(Rectangle rectangle) {
mArea = rectangle.mHeight * rectangle.mHeight;
}
public double getmArea() {
return mArea;
}
}
private static class PerimeterShapeVisitor implements ShapeVisitor{
private double mPerimeter;
@Override
public void visitor(Circle circle) {
mPerimeter = 2 * Math.PI * circle.mRadius;
}
@Override
public void visitor(Rectangle rectangle) {
mPerimeter = 2 * (rectangle.mHeight + rectangle.mHeight);
}
public double getmPerimeter() {
return mPerimeter;
}
}
private static interface Shape{
void accept(ShapeVisitor visitor);
}
private static class Circle implements Shape{
private int mRadius;
public Circle(int mRadius) {
this.mRadius = mRadius;
}
@Override
public void accept(ShapeVisitor visitor) {
visitor.visitor(this);
}
}
private static class Rectangle implements Shape{
private int mWidth;
private int mHeight;
public Rectangle(int mWidth, int mHeight) {
this.mWidth = mWidth;
this.mHeight = mHeight;
}
@Override
public void accept(ShapeVisitor visitor) {
visitor.visitor(this);
}
}
}