java设计模式之访问者模式
定义:
《设计模式》一书对于访问者模式给出的定义为:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式的组成结构:
1) 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。
2) 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。
3) 元素角色(Element):定义一个Accept操作,它以一个访问者为参数。
4) 具体元素角色(Concrete Element):实现由元素角色提供的accept操作。
实现:
代码:
(1)创建一个元素角色(element)接口
package study_02.designpattern.visitor;
/**
* The <strong>element</strong> interface simply
* defines an <code>accept</code> method to allow
* the <strong>visitor</strong> to run some action over that element
* @author WWX
*/
public interface ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor);
}
(2)创建具体具体元素角色(Concrete Element):实现由元素角色提供的accept操作
package study_02.designpattern.visitor;
public class Keyboard implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
package study_02.designpattern.visitor;
public class Monitor implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
package study_02.designpattern.visitor;
public class Mouse implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
package study_02.designpattern.visitor;
/**
* the <strong>ConcreteElement</strong> will implement this accept method
* @author WWX
*/
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);
}
}
(3)创建一个访问者角色(Visitor)
package study_02.designpattern.visitor;
/**
* The core of this pattern is the <strong>Visitor</strong> interface.
* This interface defines a visit operation for each type
* of <strong>ConcreteElement</strong> in the object structure
* @author WWX
*/
public interface ComputerPartVisitor {
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
(4)创建具体访问者角色(Concrete Visitor),实现每个由访问者角色(Visitor)声明的操作。
package study_02.designpattern.visitor;
/**
* the <strong>>ConcreteVisitor</strong>> implements the operations defined
* in the <strong>Visitor</strong> interface
* @author WWX
*/
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.");
}
}
(5)实例
package study_02.designpattern.visitor;
public class VisitorPatternDemo {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
}
}