JAVA 设计模式 访问者模式

本文介绍访问者模式的概念、结构及应用场景。通过示例代码展示如何使用访问者模式为不同的对象结构定义新操作,同时保持良好的扩展性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用途


访问者模式 (Visitor)
表示一个作用于某对象结构中的各元素的操作。
它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式是一种 行为型模式


 

用途

图-访问者模式结构图

Visitor : 为该对象结构中 ConcreteElement 的每一个类声明一个 Visit 操作。
abstract  class Visitor {
     public  abstract  void VisitConcreteElementA(ConcreteElementA elementA);
     public  abstract  void VisitConcreteElementB(ConcreteElementB elementB);
}

ConcreteVisitor : 实现每个由 Visitor 声明的操作。每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。

class ConcreteVisitor1  extends Visitor {
    @Override
     public  void VisitConcreteElementA(ConcreteElementA elementA) {
        System.out.println( this.getClass().getName() + " 访问 " + elementA.getClass().getName());
    }

    @Override
     public  void VisitConcreteElementB(ConcreteElementB elementB) {
        System.out.println( this.getClass().getName() + " 访问 " + elementB.getClass().getName());
    }
}

class ConcreteVisitor2  extends Visitor {
    @Override
     public  void VisitConcreteElementA(ConcreteElementA elementA) {
        System.out.println( this.getClass().getName() + " 访问 " + elementA.getClass().getName());
    }

    @Override
     public  void VisitConcreteElementB(ConcreteElementB elementB) {
        System.out.println( this.getClass().getName() + " 访问 " + elementB.getClass().getName());
    }
}

Element : 定义一个Accpet操作,它以一个访问者为参数。

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

ConcreteElement : 实现 Element 声明的 Accept 操作。

class ConcreteElementA  extends Element {
    @Override
     public  void Accept(Visitor visitor) {
        visitor.VisitConcreteElementA( this);
    }
}

class ConcreteElementB  extends Element {
    @Override
     public  void Accept(Visitor visitor) {
        visitor.VisitConcreteElementB( this);
    }
}

ObjectStructure : 可以枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。

class ObjectStructure {
     private List<Element> elements =  new ArrayList<Element>();
    
     public  void Attach(Element element) {
        elements.add(element);
    }
    
     public  void Detach(Element element) {
        elements.remove(element);
    }
    
     public  void Accept(Visitor visitor) {
         for (Element elem : elements) {
            elem.Accept(visitor);
        }
    }
}

测试代码

public  class VisitorPattern {
     public  static  void main(String[] args) {
        ObjectStructure o =  new ObjectStructure();
        o.Attach( new ConcreteElementA());
        o.Attach( new ConcreteElementB());
        
        ConcreteVisitor1 v1 =  new ConcreteVisitor1();
        ConcreteVisitor2 v2 =  new ConcreteVisitor2();
        
        o.Accept(v1);
        o.Accept(v2);
    }
}
View Code

运行结果

ConcreteVisitor1 访问 ConcreteElementA
ConcreteVisitor1 访问 ConcreteElementB
ConcreteVisitor2 访问 ConcreteElementA
ConcreteVisitor2 访问 ConcreteElementB
View Code



推荐

本文属于 JAVA设计模式系列



参考资料

《大话设计模式》

《HeadFirst设计模式》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值