<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.例子
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);
}
参考书籍:《大话设计模式》-程杰 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|