前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA 设计模式 访问者模式

JAVA 设计模式 访问者模式

作者头像
静默虚空
发布2018-01-05 11:33:32
5190
发布2018-01-05 11:33:32
举报

用途

访问者模式 (Visitor)

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

访问者模式是一种行为型模式

用途

图-访问者模式结构图

Visitor : 为该对象结构中 ConcreteElement 的每一个类声明一个 Visit 操作。

代码语言:txt
复制
abstract class Visitor {
 public abstract void VisitConcreteElementA(ConcreteElementA elementA);
 public abstract void VisitConcreteElementB(ConcreteElementB elementB);
 }

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

代码语言:txt
复制
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操作,它以一个访问者为参数。

代码语言:txt
复制
abstract class Element {
 public abstract void Accept(Visitor visitor);
 }

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

代码语言:txt
复制
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 : 可以枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。

代码语言:txt
复制
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);
         }
     }
 }

测试代码

代码语言:txt
复制
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);
     }
 }

运行结果

代码语言:txt
复制
 ConcreteVisitor1 访问 ConcreteElementA
 ConcreteVisitor1 访问 ConcreteElementB
 ConcreteVisitor2 访问 ConcreteElementA
 ConcreteVisitor2 访问 ConcreteElementB

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-01-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档