应用场景:教师或学生奖励审批系统、一个对象包含很多类型的对象,希望对这些对象实施一些依赖其具体类型的操作等。
访问者模式使得用户可以在不修改现有系统的情况下拓展系统的功能,为这些不同类型的元素增加新的操作。(开闭原则)
定义:表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素类的前提下定义作用于这些元素的新操作。
模式结构图:(摘抄自刘伟主编的设计模式相关PPT)
说明:ObjectStructure对象:是一个元素的集合,它用于存放元素对象,并且提供了遍历其内部元素的方法。它可以结合组合模式来实现,也可以是一个简单的集合对象,如一个List对象或一个Set对象。
具体代码:
客户端:
package com.visitorpattern.hing;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Product b1=new Book();
Product b2=new Book();
Product a1=new Apple();
Visitor visitor;
BuyBasket basket=new BuyBasket();
basket.addProduct(b1);
basket.addProduct(b2);
basket.addProduct(a1);
visitor=new Customer();
visitor.setName("张三");
basket.accept(visitor);
basket.removeProduct(b1);
basket.accept(visitor);
}
}
抽象访问类:
package com.visitorpattern.hing;
public abstract class Visitor {
protected String name;
public void setName(String name) {
this.name=name;
}
public abstract void visit(Apple apple);
public abstract void visit(Book book);
}
具体访问类:
package com.visitorpattern.hing;
public class Customer extends Visitor{
@Override
public void visit(Apple apple) {
// TODO Auto-generated method stub
System.out.println("顾客"+name+"选苹果");
}
@Override
public void visit(Book book) {
// TODO Auto-generated method stub
System.out.println("顾客"+name+"买书");
}
}
抽象元素类:
package com.visitorpattern.hing;
public interface Product {
void accept(Visitor visitor);
}
具体元素类:
package com.visitorpattern.hing;
public class Apple implements Product{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
package com.visitorpattern.hing;
public class Book implements Product{
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
对象结构类:
package com.visitorpattern.hing;
import java.util.ArrayList;
import java.util.Iterator;
public class BuyBasket {
private ArrayList list=new ArrayList();
public void accept(Visitor visitor) {
Iterator i = list.iterator();
while(i.hasNext()) {
((Product)i.next()).accept(visitor);
}
}
public void addProduct(Product product) {
list.add(product);
}
public void removeProduct(Product product) {
list.remove(product);
}
}
(摘抄自刘伟主编的设计模式书籍内容)