visitor-访问模式

解决问题

采用“双重委派”方式,使访问者和被访问对象进行隔离。有点难理解。。。。

应用场景

它有一定的应用局限性,访问者和被访问者应该可被枚举,结构相对固定。比如说:运算符处理与数据结构的关系。(运算符+-*/可枚举,类型如String, int ,Object也是可以枚举的)

原理

image

示例

我们以处理运算表达式为例,来写个例子,只涉及+-,类型只涉及int,float, double。

public interface Element {
    public void accept(Visitor visitor);
}

@AllArgsConstructor
@Data
public class DoubleElement implements Element {
    private double left;
    private double right;

    @Override
    public void accept(Visitor visitor) {
       visitor.cal(this);
    }
}

@AllArgsConstructor
@Data
public class FloatElement implements Element {
    private int left;
    private int right;

    @Override
    public void accept(Visitor visitor) {
        visitor.cal(this);
    }
}
@AllArgsConstructor
@Data
public class IntElement implements Element {
    private int left;
    private int right;

    @Override
    public void accept(Visitor visitor) {
        visitor.cal(this);
    }
}
public interface Visitor {
    public void cal(DoubleElement element);

    public void cal(FloatElement element);

    public void cal(IntElement element);
}

public class MinusVisitor implements Visitor {
    public void cal(DoubleElement element) {
        System.out.print(element.getLeft()
        + "-"
        + element.getRight()
        + "="
        + (element.getLeft() - element.getRight()));
    }

    public void cal(FloatElement element) {
        System.out.print(element.getLeft()
                + "-"
                + element.getRight()
                + "="
                + (element.getLeft() + element.getRight()));
    }

    public void cal(IntElement element) {
        System.out.print(element.getLeft()
                + "-"
                + element.getRight()
                + "="
                + (element.getLeft() - element.getRight()));
    }
}
public class PlusVisitor implements Visitor {
    public void cal(DoubleElement element) {
        System.out.print(element.getLeft()
        + "+"
        + element.getRight()
        + "="
        + (element.getLeft() + element.getRight()));
    }

    public void cal(FloatElement element) {
        System.out.print(element.getLeft()
                + "+"
                + element.getRight()
                + "="
                + (element.getLeft() + element.getRight()));
    }

    public void cal(IntElement element) {
        System.out.print(element.getLeft()
                + "+"
                + element.getRight()
                + "="
                + (element.getLeft() + element.getRight()));
    }
}

public class Client {
    public static void main(String[] args) {
        DoubleElement doubleElement = new DoubleElement(10.21, 3.14);
        IntElement intElement = new IntElement(45, 21);
        PlusVisitor plusVisitor = new PlusVisitor();
        MinusVisitor minusVisitor = new MinusVisitor();

        doubleElement.accept(plusVisitor);
        intElement.accept(plusVisitor);
        intElement.accept(minusVisitor);
    }
}

参考

https://en.wikipedia.org/wiki/Visitor_pattern

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 婚姻,婚姻,你好自为之吧 高小棠 关注 2018-01-23 18:05 · 字数 2088 · 阅读 154 从...
    高小棠东方阅读 3,203评论 0 0
  • 不知道是不是真得单身太久了,昨晚无意间点开了韩国电视剧hotel king,猛生生地被李东旭的肌肉和颜值迷得...
    小歌阅读 845评论 0 1
  • 本来是纠结于云中花房和棚有趣的名字。做我们寄养服务的开始。后来今天。忽然收到了商标受理书,表示开心~然后就想,那么...
    小趣儿阅读 1,670评论 0 1
  • 柳哲 中华文化博大精深,家谱家训文化犹如一颗明珠,镶嵌在华夏文明悠久历史的长河中,历经岁月的打磨至今仍熠熠生辉。姓...
    柳志儒阅读 1,482评论 0 1