首页 > 其他 > 详细

参观者模式

时间:2020-12-15 00:09:36      阅读:57      评论:0      收藏:0      [点我收藏+]

Visitor Patterns

GoF定义:表示在一个对象结构的某个元素上的一个操作。这个模式可以让你在不改变这个元素所在的类的情况下定义新的操作

概念

这个模式帮助我们在不对现有类进行改变的前提下增添新功能。所以我们在这里可以遵循open/close原则(对扩展开放,对修改关闭)

例子

现实世界:假如我们叫了一个出租车,当我们上车之后,它有很多种路线可以到达我们的目的地,但是我们对此是未知的
代码世界:在给公共接口添加新功能时可以使用这个模式,即通过一个visiting类来和实现类一起实现功能(不影响实现类本身的行为)

展示

技术分享图片

IOriginalInterface和MyClass是原始的接口和实现类

技术分享图片

代码

class Scratch {
    public static void main(String[] args) {
        System.out.println("***Visitor Pattern Demo***\n");
        IVisitor v = new Visitor();
        MyClass myClass = new MyClass();
        myClass.accept(v);
    }
}

interface IVisitor {
    void visit(MyClass myClass);
}

interface IOriginalInterface {
    void accept(IVisitor visitor);
}

class MyClass implements IOriginalInterface {
    private int intVal;

    public int getIntVal() {
        return intVal;
    }

    public void setIntVal(int intVal) {
        this.intVal = intVal;
    }

    @Override
    public void accept(IVisitor visitor) {
        System.out.println("Initial value of the integer :"+ intVal);
        visitor.visit(this);
        System.out.println("\nValue of the integer now :"+ intVal);
    }
}

class Visitor implements IVisitor {
    @Override
    public void visit(MyClass myClass) {
        System.out.println("Visitor is trying to change the integer value");
        myClass.setIntVal(100);
        System.out.println("Exiting from Visitor- visit");
    }
}

Note

  1. 在不改变原有类结构的基础上添加新功能时这个模式很有用(只需要实现一个visitor接口可以放visitor进来)
  2. visitor的操作由统一的规则来控制(接口)
  3. 在visitor使用对象的时候,对这个类本身的处理应该停止。如果退出类的结构很复杂,那么参观(visit)的过程也很复杂
  4. 当我们频繁修改原有类结构的继承层次时,维护visitor类变得很麻烦(因为它的接口接收的是实现类)
  5. 有时我们想要在一些对象上进行和类没有关联的操作,但是这些操作可能会直接或间接地影响系统中的类,此时我们可以把这些操作都放在visitor类中

思考

这个模式正如书中所说,核心在于不改变已有的类的结构的前提下为对象增添一些功能,感觉还是比较实用的

参观者模式

原文:https://www.cnblogs.com/mouseGo/p/14136170.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!