访问者模式:为某个对象组合添加新功能,而又不改变组合的内部结构
- Visitor抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口
- ConcreteVisitor具体访问者角色,实现Visitor声明的接口
- Element定义一个接受访问操作(accept()),它以一个访问者(Visitor)作为参数
- ConcreteElement具体元素,实现了抽象元素(Element)所定义的接受操作接口
- ObjectStructure结构对象角色,这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素
特点:
- 元素类可以通过接受不同的访问者来实现对不同操作的扩展
- 将和本对象相关性较低的操作封装到访问者中,对访问者对对象组合都符合单一职责原则
- 适用于变化性较低的对象组合
举例:
1 abstract class Element { 2 public abstract void accept(IVisitor visitor); 3 public abstract void doSomething(); 4 } 5 6 interface IVisitor { 7 public void visit(Element e); 8 } 9 10 class ConcreteElement extends Element { 11 public void doSomething(){ 12 System.out.println("这是元素"); 13 } 14 15 public void accept(IVisitor visitor) { 16 visitor.visit(this); 17 } 18 } 19 20 class Visitor implements IVisitor { 21 22 public void visit(Element e) { 23 e.doSomething(); 24 } 25 } 26 27 28 public class Client { 29 public static void main(String[] args){ 30 List<Element> list = ObjectStruture.getList(); 31 for(Element e: list){ 32 e.accept(new Visitor()); 33 } 34 } 35 }