博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA 设计模式 访问者模式
阅读量:7128 次
发布时间:2019-06-28

本文共 2028 字,大约阅读时间需要 6 分钟。

用途


访问者模式 (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);
        }
    }
}

测试代码

 
View Code

运行结果

 
View Code

本文转自静默虚空博客园博客,原文链接:http://www.cnblogs.com/jingmoxukong/p/4242418.html,如需转载请自行联系原作者

你可能感兴趣的文章
Android应用架构之MVP实现
查看>>
如何用消息系统避免分布式事务?
查看>>
viewport 最佳实践
查看>>
多feature测试时后端测试环境管理的一种方案设想
查看>>
HashMap: 通俗分析核心源码
查看>>
CSS设置居中的方案总结-超全
查看>>
Feathers 入门
查看>>
css知识:flex 、bfc
查看>>
设计模式系列之「建造者模式」
查看>>
数据结构—线性表
查看>>
Mybatis技术内幕(2.3.5):反射模块-Property工具类
查看>>
软件测试工程师的技能树
查看>>
聊聊架构
查看>>
小米4.0系统如何不Root激活xposed框架的方法
查看>>
Android跨界面共享数据——LiveData应用
查看>>
华为余承东:自产AI芯片 旗舰机比苹果、三星强
查看>>
微软Azure SQL数据仓储供优惠价格购买预留容量
查看>>
Java8ConcurrentHashMap
查看>>
数据分析Power BI数据可视化教程(三)——如何创建矩阵和表以及散点图
查看>>
NoSQL最新现状和趋势:云NoSQL数据库将成重要增长引擎
查看>>