访问者模式

访问者模式:

修改各元素类的前提下定义作用于这些元素的新操作,也就是动态的增加新的方法。ConcreteElementA和ConcreteElementB 就是原有的类,现在需要给ConcreteElementA增加一个方法
visitElementA给ConcreteElementB增加一个方法 visitElementB,接口Visitor定义了这两个方法,那么怎么让新增的方法被调用呢?于是出现了Visitor的实现类,
当然被访问了两个类也有个新名字的方法叫accept,并抽象为接口,这个入参是关键,因为这里恰好是衔接的地方,
入参是访问者接口,这也就是把访问者的方法暴漏给了被访问的两个类,呵呵,作用可想而知了:

 
 
 
 

package com.jerry.design.visitor; import java.util.ArrayList; import java.util.Collection; interface Visitor{ public void visitElementA(ConcreteElementA elementA);//针对具体元素A的新方法 public void visitElementB(ConcreteElementB elementB);//针对具体元素B的新方法 } interface Element{ public void accept(Visitor visitor); } class ConcreteVisitor implements Visitor{//具体的访问者 public void visitElementA(ConcreteElementA elementA) { System.out.println(elementA.getName()+" visited by ConcreteVisitor "); } public void visitElementB(ConcreteElementB elementB) { System.out.println(elementB.getName()+" visited by ConcreteVisitor "); } } class ConcreteElementA implements Element{//具体元素A private String name; public ConcreteElementA(String name){ this.name=name; } public void accept(Visitor visitor) {//接受访问者调用它针对该元素的新方法 visitor.visitElementA(this); } public String getName() { return name; } } class ConcreteElementB implements Element{//具体元素B private String name; public ConcreteElementB(String name){ this.name=name; } public String getName() { return name; } public void accept(Visitor visitor) {//接受访问者调用它针对该元素的新方法 visitor.visitElementB(this); } } class ObjectStructure{//对象结构即元素的集合 private Collection<Element> collection=new ArrayList<Element>(); public void attach(Element element){ collection.add(element); } public void detach(Element element){ collection.remove(element); } public void accept(Visitor visitor ) { for(Element element:collection){ element.accept(visitor); } } } public class Test { public static void main(String args[]){ Element elementA=new ConcreteElementA("ElementA"); Element elementB=new ConcreteElementB("ElementB"); Visitor visitor=new ConcreteVisitor(); ObjectStructure os=new ObjectStructure(); os.attach(elementA); os.attach(elementB); os.accept(visitor); } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值