封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作
数据结构比较稳定,想扩充新的功能.
这一点跟装饰者模式有点像,二者不同的是,装饰者模式是增强原有功能.
提供一个接受访问者的接口,然后回调访问者的方法.
这一点跟观察者模式有点像.
// 访问者接口,提供回调接口
public interface Visitor {
void callBack();
}
//被访问者提供接待访问者接口
public abstract class Customer {
public abstract void accept(Visitor visitor);
}
//普通客户
public class CommonCustomer extends Customer {
@Override
public void accept(Visitor visitor) {
visitor.callBack();
}
}
// 企业客户
public class EnterpriceCustomer extends Customer{
@Override
public void accept(Visitor visitor) {
visitor.callBack();
}
}
// 给客户添加产品偏好分析功能
public class ProductPreferVisitor implements Visitor {
@Override
public void callBack() {
System.out.println("开始产品偏好分析");
}
}
public class Client {
public static void main(String[] args) {
// 企业用户
EnterpriceCustomer enterpriceCustomer = new EnterpriceCustomer();
// 普通用户
CommonCustomer commonCustomer = new CommonCustomer();
// add 产品偏好分析功能
ProductPreferVisitor productPreferVisitor = new ProductPreferVisitor();
// 给企业用户添加产品偏好分析功能
enterpriceCustomer.accept(productPreferVisitor);
// 给普通用户添加产品偏好分析功能
commonCustomer.accept(productPreferVisitor);
}
}
如果给客户添加价值分析功能,则只需要新增一个实现visitor接口的接口类,并不需要修改客户customer的数据结构
public class WorthAnalysistVisitor implements Visitor{
@Override
public void callBack() {
System.out.println("开始价值分析");
}
}
public class Client {
public static void main(String[] args) {
// 企业用户
EnterpriceCustomer enterpriceCustomer = new EnterpriceCustomer();
// 普通用户
CommonCustomer commonCustomer = new CommonCustomer();
// add 产品偏好分析功能
ProductPreferVisitor productPreferVisitor = new ProductPreferVisitor();
// 给企业用户添加产品偏好分析功能
enterpriceCustomer.accept(productPreferVisitor);
// 给普通用户添加产品偏好分析功能
commonCustomer.accept(productPreferVisitor);
//add 价值分析功能
Visitor worthAnalysistVisitor = new WorthAnalysistVisitor();
// 给企业用户添加价值分析功能
enterpriceCustomer.accept(worthAnalysistVisitor);
// 给普通用户添加价值分析功能
commonCustomer.accept(worthAnalysistVisitor);
}
}