24、大话设计模式之访问者模式

本文详细介绍了访问者模式,包括抽象访问者、具体访问者、抽象元素、具体元素和对象结构角色。此外,还讨论了双分派技术,解释了静态分派、动态分派和双分派的概念。最后,探讨了访问者模式的使用场景,强调了其在增加新操作时的灵活性和扩展性。
摘要由CSDN通过智能技术生成

作用:

1、表示一个作用于某对象结构中的各元素的操作,他使你可以在不改变元素的类的前提下定义作用于这些元素的新操作。

2、访问者模式适用于数据结构相对稳定的系统,他把数据结构和作用于结构上的操作之间的耦合解开,使得操作可以相对自由的演化。

3、访问者模式的目的就是把处理从数据结构中分离出来,如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是比较适合的。

4、访问者模式增加新的操作很容易,因为增加新的操作,就相当于增加一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。

5、访问者模式增加新的数据结构比较困难

1、访问者模式

1、抽象访问者(Visitor)角色

定义了对每一个元素 (Element) 访问的行为,它的参数就是可
以访问的元素,它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的,从
这点不难看出,访问者模式要求元素类的个数不能改变

abstract class Visitor {
    public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);

    public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}

2、具体访问者(ConcreteVisitor)角色

给出对每一个元素类访问时所产生的具体行为。

class ConcreteVisitor1 extends Visitor {
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
    }

    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
    }
}

class ConcreteVisitor2 extends Visitor {
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
    }

    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName()+"被"+this.getClass().getSimpleName()+"访问");
    }
}

3、抽象元素(Element)角色

定义了一个接受访问者的方法( accept ),其意义是指,每一个元素都要可以被访问者访问。

abstract class Element {
    public abstract void accept(Visitor visitor);
}

4、具体元素(ConcreteElement)角色

提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。

class ConcreteElementA extends Element {
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementA(this);
    }

    public void operationA(){ 
    }
}

class ConcreteElementB extends Element {
    public void accept(Visit
  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

越来越没意思

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值