版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1021979964/article/details/88428883
访问者模式(Visitor)
访问者模式:对于存储在一个集合中的对象,他们可能具有不同的类型(即使有一个公共的接口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访问方式也有所不同。
定义:表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变元素的类的前提下定义作用于这些元素的新操作。
角色构成:
Visitor:表示访问者的抽象类或者接口,用于定义每个元素中访问的行为,参数就是可以访问的元素,一般方法数量与元素数量一致。
ConcreteVisitor:表示具体的访问者,继承Visitor并对其声明的抽象方法提供具体的实现。
Element:表示元素的抽象类或接口,即访问者实际要访问的对象,Element角色需要对访问者提供一个开发的接口。为了让每一个元素都可以被访问者访问。
ConreteElement:表示具体的元素类,提供接受访问方法的具体实现,一般是使用访问者提供的访问该元素类的方法。
ObjectStructure:表示定义结构对象,对象结构是一个抽象表述,管理元素集合并可以迭代这些元素提供给访问者访问。
Visitor
package com.kevin.行为型模式.访问者模式.visitor;
/**
* @author kevin
* @version 1.0
* @description 访问者的接口
* @createDate 2019/3/3
*/
public interface ComputerPartVisitor {
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
ConcreteVisitor
package com.kevin.行为型模式.访问者模式.visitor;
/**
* @author kevin
* @version 1.0
* @description 具体的访问者
* @createDate 2019/3/3
*/
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(Computer computer) {
System.out.println("Displaying Computer.");
}
@Override
public void visit(Mouse mouse) {
System.out.println("Displaying Mouse.");
}
@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
@Override
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}
Element
package com.kevin.行为型模式.访问者模式.visitor;
/**
* @author kevin
* @version 1.0
* @description 元素接口(Element)
* @createDate 2019/3/3
*/
public interface ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor);
}
ConreteElement
package com.kevin.行为型模式.访问者模式.visitor;
/**
* @author kevin
* @version 1.0
* @description 具体的元素类
* @createDate 2019/3/3
*/
public class Computer implements ComputerPart {
ComputerPart[] parts;
public Computer(){
parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor);
}
computerPartVisitor.visit(this);
}
}
package com.kevin.行为型模式.访问者模式.visitor;
/**
* @author kevin
* @version 1.0
* @description 具体的元素类
* @createDate 2019/3/3
*/
public class Keyboard implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
package com.kevin.行为型模式.访问者模式.visitor;
/**
* @author kevin
* @version 1.0
* @description 具体的元素类
* @createDate 2019/3/3
*/
public class Monitor implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
package com.kevin.行为型模式.访问者模式.visitor;
/**
* @author kevin
* @version 1.0
* @description 具体的元素类
* @createDate 2019/3/3
*/
public class Mouse implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
测试访问者模式
package com.kevin.行为型模式.访问者模式.visitor;
/**
* @author kevin
* @version 1.0
* @description 测试访问者模式
* @createDate 2019/1/18
*/
public class Test {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
}
}
开发中的应用场景
- XML文档解析器设计
- 编译器的设计
- 复杂集合对象的处理