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

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

用途


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

测试代码

img_405b18b4b6584ae338e0f6ecaf736533.gif
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

运行结果

img_405b18b4b6584ae338e0f6ecaf736533.gif
ConcreteVisitor1 访问 ConcreteElementA
ConcreteVisitor1 访问 ConcreteElementB
ConcreteVisitor2 访问 ConcreteElementA
ConcreteVisitor2 访问 ConcreteElementB
View Code

推荐

本文属于

参考资料

《大话设计模式》

《HeadFirst设计模式》

转载地址:http://tghga.baihongyu.com/

你可能感兴趣的文章
编码列表
查看>>
eigrp 配置
查看>>
谈一谈 redis 集群
查看>>
concurrent包
查看>>
在Linux下调试Python代码的各种方法
查看>>
centos7塔建MQ服务器
查看>>
Peer authentication failed for user
查看>>
超强的.NET图像工具包VintaSoftImaging.NET SDK更新至v8.6丨75折优惠
查看>>
阿里云上Kubernetes集群联邦
查看>>
洛谷2219:[HAOI2007]修筑绿化带——题解
查看>>
监控webservice信息
查看>>
a标签中href=""的几种用法(转)
查看>>
python
查看>>
ubuntu 常用生产环境部署配置测试调优
查看>>
【JS】//将中文逗号转换为英文逗号
查看>>
在VS2012中实现Ext JS的智能提示太简单了
查看>>
Extnet Direct 提交后台事件文件下载设置
查看>>
邻接矩阵与二叉排序树
查看>>
CSS选择器
查看>>
购物车练习
查看>>