设计模式之访问者模式

访问者模式Visitor


CRM 客户关系管理


类型:企业客户,个人客户
功能:提出服务申请、客户偏好分析、客户价值分析


问题:系统难以理解、不便于扩展


定义:
表示一个作用于某对象结构中的各元素的操作。
它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作




Visitor:
访问者接口,为所有的访问者对象声明一个visit方法,
用来代表为对象添加的功能,理论上可以代表任意的功能
ConcreteVisitor:
具体的访问者实现,实现要真正被添加到对象结构中的功能
Element:
抽象的元素对象
ConcreteElement:具体的元素对象


ObjectStructure:对象结构,通常包含多个被访问的对象




相关代码如下:


受访者接口类:

/**
 * 客户父类(抽象元素) 
 * @date 2016年2月27日 
 */
public abstract class Customer {

	private String customerId;
	private String name;
	
	/**
	 * 接受访问
	 * @param visitor
	 */
	public abstract void accept(Visitor visitor);
	
	public String getCustomerId() {
		return customerId;
	}
	public void setCustomerId(String customerId) {
		this.customerId = customerId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	} 
	
}

/**
 * 企业客户(具体的元素实现) 
 * @date 2016年2月27日 
 */
public class EnterpriseCustomer extends Customer {

	private String linkman;
	private String linkTelephone;
	private String registerAddress;

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

	public String getLinkman() {
		return linkman;
	}

	public void setLinkman(String linkman) {
		this.linkman = linkman;
	}

	public String getLinkTelephone() {
		return linkTelephone;
	}

	public void setLinkTelephone(String linkTelephone) {
		this.linkTelephone = linkTelephone;
	}

	public String getRegisterAddress() {
		return registerAddress;
	}

	public void setRegisterAddress(String registerAddress) {
		this.registerAddress = registerAddress;
	}

}

/**
 * 个人客户(具体的元素实现) 
 * @date 2016年2月27日 
 */
public class PersonalCustomer extends Customer {

	private String telephone;
	private int age;

	@Override
	public void accept(Visitor visitor) {
		visitor.visitPersonalCustomer(this);
	}

	public String getTelephone() {
		return telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

访问者相关接口类:

/**
 * 访问者接口 
 * @date 2016年2月27日 
 */
public interface Visitor {

	/**
	 * 访问企业客户
	 * @param customer
	 */
	void visitEnterpriseCustomer(EnterpriseCustomer customer);
	
	/**
	 * 访问个人客户
	 * @param customer
	 */
	void visitPersonalCustomer(PersonalCustomer customer);
	
}
/**
 * 偏好分析功能 
 * @date 2016年2月27日 
 */
public class PredilectionAnalyzeVisitor implements Visitor {

	@Override
	public void visitEnterpriseCustomer(EnterpriseCustomer customer) {
		System.out.println("企业"+customer.getName()+"正在进行偏好分析");

	}

	@Override
	public void visitPersonalCustomer(PersonalCustomer customer) {
		System.out.println("个人"+customer.getName()+"正在进行偏好分析");
	}

}

/**
 * 申请服务功能(申请服务的访问者) 
 * @date 2016年2月27日 
 */
public class ServiceRequestVisitor implements Visitor {

	@Override
	public void visitEnterpriseCustomer(EnterpriseCustomer customer) {
		System.out.println("企业"+customer.getName()+"正在申请服务");
	}

	@Override
	public void visitPersonalCustomer(PersonalCustomer customer) {
		System.out.println("个人"+customer.getName()+"正在申请服务");
	}

}
import java.util.ArrayList;
import java.util.Collection;

/**
 * 对象结构
 * @author Jason 
 * @date 2016年2月27日 
 */
public class ObjectStructure {

	//客户集合
	private Collection<Customer> col = new ArrayList<Customer>();
	
	/**
	 * 接受访问(添加功能)
	 * @param visitor
	 */
	public void handleRequest(Visitor visitor){
		for (Customer c : col) {
			c.accept(visitor);
		}
	}
	
	/**
	 * 添加元素
	 * @param c
	 */
	public void addElement(Customer c){
		col.add(c);
	}
	
}


代码调用:

public class Client {

	public static void main(String[] args) {
		//对象结构
		ObjectStructure os = new ObjectStructure();
		//添加元素
		EnterpriseCustomer c1 = new EnterpriseCustomer();
		c1.setName("锤子科技");
		os.addElement(c1);
		
		PersonalCustomer c2 = new PersonalCustomer();
		c2.setName("罗永浩");
		os.addElement(c2);
		
		//添加功能(接受访问)
		os.handleRequest(new ServiceRequestVisitor());
		os.handleRequest(new PredilectionAnalyzeVisitor());
		
	}

}

运行结果:

企业锤子科技正在申请服务
个人罗永浩正在申请服务
企业锤子科技正在进行偏好分析
个人罗永浩正在进行偏好分析


整理自教程



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值