PerKins Zhu

Le vent se lève,il faut tenter de vivre.

导航

设计模式—访问者模式

Posted on 2016-09-25 09:33  PerKins.Zhu  阅读(212)  评论(0编辑  收藏  举报

访问者模式:表示一个作用于某对象结构中的各个元素操作。可以在不改变元素类的前提下为这种对象添加新操作

  优势:很容易扩展对象的功能,不需要再对对象就行修改操作,只需要添加一个功能扩展类即可。

  劣势:数据结构中存储的对象类型需要唯一,不允许有两种及以上类型    

示例说明:为企业和个人客户增加数据分析请求功能(新操作)。

结构类图:

先定义一个Customer 抽象类,添加accept抽象方法。

package com.zpj.designMode.Visitor;

/**
 * @author PerKins Zhu
 * @date:2016年9月25日 上午7:10:53
 * @version :1.1
 * 
 */
public abstract class Customer {
    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public abstract void accept(Visitor vistor);
}

 

添加个人PersonCustomer 

和企业客户 EnterpriseCustomer 

package com.zpj.designMode.Visitor;

/**
 * @author PerKins Zhu
 * @date:2016年9月25日 上午7:12:08
 * @version :1.1
 * 
 */
public class PersonCustomer extends Customer {

    @Override
    public void accept(Visitor vistor) {
        vistor.visitPersonCustomer(this);
    }

}

package com.zpj.designMode.Visitor;

/**
 * @author PerKins Zhu
 * @date:2016年9月25日 上午7:13:57
 * @version :1.1
 * 
 */
public class EnterpriseCustomer extends Customer {

    @Override
    public void accept(Visitor vistor) {
        vistor.visitEnterpriseCustomer(this);
    }

}

 

添加访问者抽象类Visitor ,这里也可以定义一个接口。

package com.zpj.designMode.Visitor;

/**
 * @author PerKins Zhu
 * @date:2016年9月25日 上午7:06:42
 * @version :1.1
 * 
 */
public abstract class Visitor {
    public abstract void visitPersonCustomer(PersonCustomer personCustomer);

    public abstract void visitEnterpriseCustomer(EnterpriseCustomer enterpriseCustomer);
}

 

添加两个功能扩展子类:

  服务请求ServiceRequestVisitor

   数据分析请求PredilectionAnalyzeVisitor 

package com.zpj.designMode.Visitor;

/**
 * @author PerKins Zhu
 * @date:2016年9月25日 上午7:16:47
 * @version :1.1
 * 
 */
public class ServiceRequestVisitor extends Visitor {

    @Override
    public void visitPersonCustomer(PersonCustomer personCustomer) {
        System.out.println(personCustomer.getType() + "提出服务请求!");
    }

    @Override
    public void visitEnterpriseCustomer(EnterpriseCustomer enterpriseCustomer) {
        System.out.println(enterpriseCustomer.getType() + "提出服务请求!");

    }

}

package com.zpj.designMode.Visitor;

/**
 * @author PerKins Zhu
 * @date:2016年9月25日 上午7:22:48
 * @version :1.1
 * 
 */
public class PredilectionAnalyzeVisitor extends Visitor {

    @Override
    public void visitPersonCustomer(PersonCustomer personCustomer) {
        System.out.println(personCustomer.getType() + "提出数据分析请求!");
    }

    @Override
    public void visitEnterpriseCustomer(EnterpriseCustomer enterpriseCustomer) {
        System.out.println(enterpriseCustomer.getType() + "提出数据分析请求!");
    }

}

 

既然是对某个数据结构中的对象进行操作,肯定要添加一个数据结构

package com.zpj.designMode.Visitor;

import java.util.ArrayList;
import java.util.List;

/**
 * @author PerKins Zhu
 * @date:2016年9月25日 上午7:24:23
 * @version :1.1
 * 
 */
public class ObjectStructure {
    private List<Customer> customers = new ArrayList<Customer>();

    public void add(Customer cus) {
        customers.add(cus);
    }

    public void request(Visitor vis) {
        for (Customer cus : customers) {
            cus.accept(vis);
        }
    }

}

 

跑一下看看

package com.zpj.designMode.Visitor;

import org.junit.Test;

/**
 * @author PerKins Zhu
 * @date:2016年9月25日 上午7:27:44
 * @version :1.1
 * 
 */
public class Client {
    @Test
    public void test01(){
        ObjectStructure obj = new ObjectStructure();
        
        Customer cu01 = new PersonCustomer();
        cu01.setType("个人用户");
        
        Customer cu02 = new EnterpriseCustomer();
        cu02.setType("企业用户");
        
        obj.add(cu01);
        obj.add(cu02);
        
        ServiceRequestVisitor vis = new ServiceRequestVisitor();
        obj.request(vis);
        
        PredilectionAnalyzeVisitor vis02 = new PredilectionAnalyzeVisitor();
        obj.request(vis02);
    }
    

}

 

运行结果:

  个人用户提出服务请求!

  企业用户提出服务请求!
  个人用户提出数据分析请求!
  企业用户提出数据分析请求!

如果需要添加Customer的功能,不需要对Customer及其实现类进行修改,只需添加一个Visitor的实现类即可,在实现类中添加Customer的新功能。

-----------------------------