设计模式之 Visitor - 访问者模式
Visitor模式也叫访问者模式,是由GoF提出的23种软件设计模式的一种。Visitor模式是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作。
本文介绍设计模式中的(Visitor)模式的概念,用法,以及实际应用中怎么样使用Visitor模式进行开发。
Visitor
????访问者抽象接口,通过visit(Element)方法访问Element(数据结构),完成对Element的操作行为。
ConcreteVisitor
????访问者的具体实现类。
ObjectStructure
????复合对象。包括所有需要被访问的数据结构对象(Element)。ObjectStructure本身也可以作为被访问者。
Element
????元素,也就是被访问者。通过accept(Visitor)方法接受Visitor的访问。
ConcreteElement
????Element的具体实现类。
????}
????public void visit(ParkPartB parkPartB) {}
}
/**
* ConcreteVisitor
* 负责打扫ParkPartB部分的清洁工类
*
*/
class VisitorCleanerB implements Visitor {
????public void visit(Park park) {}
????public void visit(ParkPartA parkPartA) {}
????public void visit(ParkPartB parkPartB) {
????????System.out.println("Clean " + parkPartB.name);????????????????
????}
}
/**
* ConcreteVisitor
* 公园的管理人员类
*
*/
class VisitorManager implements Visitor {
????public void visit(Park park) {
????????System.out.println("Check " + park.name);
????}
????public void visit(ParkPartA parkPartA) {
????????System.out.println("Check " + parkPartA.name);
????}
????public void visit(ParkPartB parkPartB) {
????????System.out.println("Check " + parkPartB.name);
????}
}
/**
* Element Role
*
*/
interface Visitable {
????void accept(Visitor visitor);
}
/**
* ObjectStructure & ConcreteElement Role
* 公园类,包含ParkPartA与ParkPartB部分
*
*/
class Park implements Visitable {
????String name;
????ParkPartA parkPartA = new ParkPartA("ParkPartA");
????ParkPartB parkPartB = new ParkPartB("ParkPartB");;
????
????public Park(String name) {
????????this.name = name;
????}
????public void accept(Visitor visitor) {
????????visitor.visit(this);
????????
????????parkPartA.accept(visitor);
????????parkPartB.accept(visitor);
????}
}
/**
* ConcreteElement Role
* 公园的一部分ParkPartA
*
*/
class ParkPartA implements Visitable {
????String name;
????
????public ParkPartA(String name) {
????????this.name = name;
????}
????
????public void accept(Visitor visitor) {
????????visitor.visit(this);
????}
}
/**
* ConcreteElement Role
* 公园的一部分ParkPartB
*
*/
class ParkPartB implements Visitable {
????String name;
????
????public ParkPartB(String name) {
????????this.name = name;
????}
????
????public void accept(Visitor visitor) {
????????visitor.visit(this);
????}
}
执行Client,输出结果:
C:\Visitor>javac *.java
C:\Visitor>java Client
---Visitor: CleanerA---
Clean ParkA
---Visitor: CleanerB---
Clean ParkB
---Visitor: Manager---
Check Park
Check ParkA
Check ParkB
C:\Visitor>
不同的访问者执行不同的行为,而且行为与数据本身完全分开了。当需要新增加一个访问者时,只需要创建一个实现Visitor接口的新类就可以了。