设计模式之“访问者模式”

设计模式之“访问者模式”

当我们定义了两个类,分别是Circle和Rectangle,它们都有resize方法和draw方法,它们都实现了shape接口并且已经重写接口中的方法resize和draw,普通的写法是这样的,当我们想给这两个类增加一个新的方法rotate,就要在shape接口、Circle类、Rectangle类中加上这个rotate方法,比较麻烦。

所以我们可以使用“访问者模式”,访问者模式使用独立出来类实现某个想要做到的功能,用这个类代替原先类中的方法。

具体来讲是这样的过程,Circle类和Rectangle类都实现shape接口,并且重写shape接口的accept方法,但是这两个类里面没有针对某种操作的方法,只有一个重写的accept方法,这个accept方法会调用visitor的visit方法,这个visitor会被DrawVisitor这些执行某个操作的类实现。每当我们想给Circle或者Rectangle加上新的操作,就可以用一个类去实现visitor这个接口并且重写里面的visit方法。用文字描述不太清晰,看代码会更加明白。

interface Shape {
    void accept(Visitor visitor);
}

class Circle implements Shape {
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

class Rectangle implements Shape {
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

interface Visitor {
    void visit(Circle circle);
    void visit(Rectangle rectangle);
}

class DrawVisitor implements Visitor {
    public void visit(Circle circle) {
        System.out.println("Drawing a circle");
    }

    public void visit(Rectangle rectangle) {
        System.out.println("Drawing a rectangle");
    }
}

class ResizeVisitor implements Visitor {
    public void visit(Circle circle) {
        System.out.println("Resizing a circle");
    }

    public void visit(Rectangle rectangle) {
        System.out.println("Resizing a rectangle");
    }
}

class RotateVisitor implements Visitor {
    public void visit(Circle circle){
        System.out.println("Rotating a circle");
    }

    public void visit(Rectangle rectangle){
        System.out.println("Rotating a rectangle");
    }
}

public class ShapeMain2 {
    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape rectangle = new Rectangle();

        Visitor drawVisitor = new DrawVisitor();
        Visitor resizeVisitor = new ResizeVisitor();
        RotateVisitor rotateVisitor = new RotateVisitor();

        circle.accept(drawVisitor);
        rectangle.accept(drawVisitor);

        circle.accept(resizeVisitor);
        rectangle.accept(resizeVisitor);

        circle.accept(rotateVisitor);
        rectangle.accept(rotateVisitor);
    }
}

 

应证了这句名言“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注