访问者模式

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作

适合的场景

数据结构比较稳定,想扩充新的功能.

这一点跟装饰者模式有点像,二者不同的是,装饰者模式是增强原有功能.

本质

提供一个接受访问者的接口,然后回调访问者的方法.

这一点跟观察者模式有点像.

示例

// 访问者接口,提供回调接口
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);
    }
}