<h4 id="1定义">1.定义
表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。
<h4 id="2适用场景">2.适用场景
适用于数据结构相对稳定,又有易于变化的算法的系统(就是element稳定,visitor经常变化)
<h4 id="3优势">3.优势
由于把数据结构和数据结构上的操作进行了解耦,也就是把处理从数据结构中分离出来,使得增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。
<h4 id="4缺点">4.缺点
源于优点,使得增加数据结构变得困难了。
<h4 id="5定性">5.定性
因为数据结构不变化的情况比较难找,所以大多数时候并不需要访问者模式,但是一旦需要访问者模式,那就是真的用它了。
<h4 id="6uml图">6.UML图
<h4 id="7例子">7.例子
- UML图
- 代码结构图
-
代码
package designmodel.chapter28;
/**
- @Author: cxh
- @CreateTime: 18/3/15 22:11
- @ProjectName: JavaBaseTest
*/
public class ConcreteElementB implements Element {
@Override
public void accept(Visitor v) {
v.visitElementB(this);
}
}
package designmodel.chapter28;
/**
* @Author: cxh
* @CreateTime: 18/3/15 22:12
* @ProjectName: JavaBaseTest
*/
public class ConcreteElementC implements Element {
@Override
public void accept(Visitor v) {
v.visitElementC(this);
}
}
package designmodel.chapter28;
/**
- @Author: cxh
- @CreateTime: 18/3/15 22:08
- @ProjectName: JavaBaseTest
*/
public class ConcreteElmentA implements Element {
@Override
public void accept(Visitor v) {
v.visitElementA(this);
}
}
package designmodel.chapter28;
/**
* @Author: cxh
* @CreateTime: 18/3/15 22:14
* @ProjectName: JavaBaseTest
*/
public class ConcreteVisitor1 implements Visitor {
@Override
public void visitElementA(Element a) {
System.out.println("ConcreteVisitor1 访问 ElementA");
}
@Override
public void visitElementB(Element b) {
System.out.println("ConcreteVisitor1 访问 ElementB");
}
@Override
public void visitElementC(Element c) {
System.out.println("ConcreteVisitor1 访问 ElementC");
}
}
package designmodel.chapter28;
/**
* @Author: cxh
* @CreateTime: 18/3/15 22:16
* @ProjectName: JavaBaseTest
*/
public class ConcreteVisitor2 implements Visitor{
@Override
public void visitElementA(Element a) {
System.out.println("ConcreteVisitor2 访问 ElementA");
}
@Override
public void visitElementB(Element b) {
System.out.println("ConcreteVisitor2 访问 ElementB");
}
@Override
public void visitElementC(Element c) {
System.out.println("ConcreteVisitor2 访问 ElementC");
}
}
package designmodel.chapter28;
/**
* @Author: cxh
* @CreateTime: 18/3/15 22:17
* @ProjectName: JavaBaseTest
*/
public class ConcreteVisitor3 implements Visitor{
@Override
public void visitElementA(Element a) {
System.out.println("ConcreteVisitor3 访问 ElementA");
}
@Override
public void visitElementB(Element b) {
System.out.println("ConcreteVisitor3 访问 ElementA");
}
@Override
public void visitElementC(Element c) {
System.out.println("ConcreteVisitor3 访问 ElementA");
}
}
package designmodel.chapter28;
/**
* @Author: cxh
* @CreateTime: 18/3/15 22:05
* @ProjectName: JavaBaseTest
*/
public interface Element{
void accept(Visitor v);
}
package designmodel.chapter28;
/**
* @Author: cxh
* @CreateTime: 18/3/15 22:18
* @ProjectName: JavaBaseTest
*/
public class Main {
public static void main(String[] args) {
ObjectStructure os=new ObjectStructure();
os.add(new ConcreteElmentA());
os.add(new ConcreteElementB());
os.add(new ConcreteElementC());
Visitor a=new ConcreteVisitor1();
Visitor b=new ConcreteVisitor2();
Visitor c=new ConcreteVisitor3();
//访问开始
os.deteach(a);
os.deteach(b);
os.deteach(c);
}
}
package designmodel.chapter28;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: cxh
* @CreateTime: 18/3/15 22:22
* @ProjectName: JavaBaseTest
*/
//访问者模式关键设计处
public class ObjectStructure{
private List<Element> elements=new ArrayList<>();
//crud
public void add(Element e){
elements.add(e);
}
public void delete(Element e){
elements.remove(e);
}
//访问每一个元素
public void deteach(Visitor vi){
elements.forEach(e->e.accept(vi));
}
}
package designmodel.chapter28;
/**
* @Author: cxh
* @CreateTime: 18/3/13 23:13
* @ProjectName: JavaBaseTest
*/
public interface Visitor {
void visitElementA(Element a);
void visitElementB(Element b);
void visitElementC(Element c);
}
参考书籍:《大话设计模式》-程杰
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。