您的位置:首页 > 其它

设计模式之访问者模式

2016-03-02 22:43 239 查看
访问者模式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());

}

}


运行结果:

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


整理自教程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: