访问者实例1
现在要开发一套客户管理系统,公司的客户分为两种:企业客户和个人客户。现需要处理客户提出的服务请求、对客户进行行为预测以及分析客户价值。
Visitor
public interface Visitor {
    public interface Visitor {
    void visitPersonalCustomer(PersonalCustomer customer);
    void visitEnterpriseCustomer(EnterpriseCustomer customer);
}Element:客户Customer
public abstract class Customer{
    public abstract void accept(Visitor visitor);
}ConcreteElement:两种客户类型
//个人客户
public class PersonalCustomer extends Customer {
    private String name;
    private int age;
     ... 省略getter setter...
    @Override
    public void accept(Visitor visitor) {
        visitor.visitPersonalCustomer(this);
    }
}
//企业用户
public class EnterpriseCustomer extends Customer {
    private String name;
    private String address;
    ... 省略getter setter...
    @Override
    public void accept(Visitor visitor) {
        visitor.visitEnterpriseCustomer(this);
    }
}ConcreteVisitor
//客户申请服务
public class ServiceRequestVisitor implements Visitor {
    @Override
    public void visitPersonalCustomer(PersonalCustomer customer) {
        System.out.println("个人客户" + customer.getName() + "提出服务请求");
    }
    @Override
    public void visitEnterpriseCustomer(EnterpriseCustomer customer) {
        System.out.println("企业客户" + customer.getName() + "提出服务请求");
    }
}
//客户行为预测
public class PredictionAnalyzeVisitor implements Visitor {
    @Override
    public void visitPersonalCustomer(PersonalCustomer customer) {
        System.out.println("对个人客户" + customer.getName() + "进行行为预测");
    }
    @Override
    public void visitEnterpriseCustomer(EnterpriseCustomer customer) {
        System.out.println("对企业客户" + customer.getName() + "进行行为预测");
    }
}
//客户价值分析
public class WorthAnalyzeVisitor implements Visitor {
    @Override
    public void visitPersonalCustomer(PersonalCustomer customer) {
        System.out.println("对个人客户" + customer.getName() + "进行价值分析");
    }
    @Override
    public void visitEnterpriseCustomer(EnterpriseCustomer customer) {
        System.out.println("对企业客户" + customer.getName() + "进行价值分析");
    }
}ObjectStructure:客户集合
public class CustomerStructure {
    private Collection<Customer> collection = new ArrayList<>();
    public void addElement(Customer customer){
        this.collection.add(customer);
    }
    public void handleRequest(Visitor visitor){
        for (Customer customer : collection){
            customer.accept(visitor);
        }
    }
}Client
public class Client {
    public static void main(String[] args) {
        CustomerStructure structure = new CustomerStructure();
        Customer xiaoming = new PersonalCustomer();
        ((PersonalCustomer) xiaoming).setName("xiaoming");
        Customer google=  new EnterpriseCustomer();
        ((EnterpriseCustomer) google).setName("google");
        structure.addElement(xiaoming);
        structure.addElement(google);
        //对客户进行行为预测
        Visitor predictionAnalyze = new PredictionAnalyzeVisitor();
        structure.handleRequest(predictionAnalyze);
        //客户申请服务
        Visitor serviceRequest = new ServiceRequestVisitor();
        structure.handleRequest(serviceRequest);
        //对客户进行价值分析
        Visitor worthAnalyze = new WorthAnalyzeVisitor();
        structure.handleRequest(worthAnalyze);
    }
}
//输出如下
对个人客户xiaoming进行行为预测
对企业客户google进行行为预测
个人客户xiaoming提出服务请求
企业客户google提出服务请求
对个人客户xiaoming进行价值分析
对企业客户google进行价值分析可以看出,要对被访问者(通常是元素集合)增加新功能,只需要新增一个访问者类。 Element中accept哪种访问者,就可以调用该访问者实现的功能。
Last updated
