【设计模式】访问者模式

简介:

一、什么是访问者模式

在不修改已有程序结构的前提下,通过添加额外的“访问者”来完成对已有代码功能的提升;//定义参考链接

二、补充说明

数据结构的每一部分对象可以接收访问者的调用,该部分对象向访问者传入自身对象,访问者反过来执行该部分对象的相关操作;//有点难理解,看代码吧~

三、角色

抽象访问者

具体访问者

抽象元素

具体元素

对象结构:能枚举它的内部元素,允许访问者访问它的元素

客户端

四、例子,JAVA代码

参考维基百科例子,链接地址,稍微修改了下

例子说明:车为对象结构角色,里面包含轮子,车身等部分对象,访问者角色对象为PrintVisitor,车接受该访问者让其访问车的各个组成对象并打印信息;

抽象访问者

复制代码
package com.pichen.dp.behavioralpattern.visitor;

public interface Visitor {
    void visit(Wheel wheel);

    void visit(Engine engine);

    void visit(Body body);

    void visit(Car car);
}
复制代码

具体访问者

复制代码
package com.pichen.dp.behavioralpattern.visitor;

public class PrintVisitor implements Visitor {
    public void visit(Wheel wheel) {
        System.out.println("Visiting " + wheel.getName() + " wheel");
    }

    public void visit(Engine engine) {
        System.out.println("Visiting engine");
    }

    public void visit(Body body) {
        System.out.println("Visiting body");
    }

    public void visit(Car car) {
        System.out.println("Visiting car");
    }
}
复制代码

抽象元素

package com.pichen.dp.behavioralpattern.visitor;
public interface Visitable {
    public void accept(Visitor visitor);
}

具体元素,车身,引擎,车轮。。。

复制代码
package com.pichen.dp.behavioralpattern.visitor;

public class Body implements Visitable {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
复制代码
复制代码
package com.pichen.dp.behavioralpattern.visitor;

public class Engine implements Visitable{
    @Override    
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
复制代码
复制代码
package com.pichen.dp.behavioralpattern.visitor;

public class Wheel implements Visitable{
    private String name;

    Wheel(String name) {
        this.name = name;
    }

    String getName() {
        return this.name;
    }
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
复制代码

对象结构

复制代码
package com.pichen.dp.behavioralpattern.visitor;

public class Car implements Visitable{
    private Engine engine = new Engine();
    private Body body = new Body();
    private Wheel[] wheels = { new Wheel("front left"), 
                               new Wheel("front right"), 
                               new Wheel("back left"),
                               new Wheel("back right") };
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
        engine.accept(visitor);
        body.accept(visitor);
        for (int i = 0; i < wheels.length; ++i)
            wheels[i].accept(visitor);
    }
}
复制代码

客户端Main

复制代码
package com.pichen.dp.behavioralpattern.visitor;

public class Main {
    static public void main(String[] args) {
        Car car = new Car();
        Visitor visitor = new PrintVisitor();
        car.accept(visitor);
    }
}
复制代码

结果打印,成功访问到car内部各个元素

复制代码
Visiting car
Visiting engine
Visiting body
Visiting front left wheel
Visiting front right wheel
Visiting back left wheel
Visiting back right wheel
复制代码

 

本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/5222390.html,如需转载请自行联系原作者
相关文章
|
5月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
60 1
|
5月前
|
设计模式
二十三种设计模式全面解析-访问者模式的高级应用和实践技巧
二十三种设计模式全面解析-访问者模式的高级应用和实践技巧
|
7天前
|
设计模式 缓存 算法
Java设计模式-访问者模式(22)
Java设计模式-访问者模式(22)
|
5月前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)
【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)
|
5月前
|
设计模式 算法
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
68 1
设计模式 - 行为型模式_ 访问者模式Visitor Pattern
|
5月前
|
设计模式 安全 Java
【设计模式】字节三面:请举例阐释访问者模式
【设计模式】字节三面:请举例阐释访问者模式
34 2
|
12月前
|
设计模式 算法
行为型设计模式11-访问者模式
行为型设计模式11-访问者模式
39 1
|
5月前
|
设计模式 算法 Java
23种设计模式,访问者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】访问者模式是一种将算法与对象结构分离的设计模式。这种模式主要用于执行一个操作(或一组操作)在一个对象结构的各元素上,它可以在不修改各元素的类的前提下定义新的操作。
42 2
|
5月前
|
设计模式 Go
[设计模式 Go实现] 行为型~访问者模式
[设计模式 Go实现] 行为型~访问者模式
|
5月前
|
设计模式 算法 编译器
【设计模式系列笔记】访问者模式
访问者模式是一种行为设计模式,旨在将算法与对象结构分离,使得能够在不修改元素类的前提下定义新的操作。这一模式的核心思想是在元素类中添加一个接受访问者的方法,从而实现在不同元素上执行不同操作的能力。
55 0