设计模式之访问者模式

来源:互联网 发布:整型数据的溢出 编辑:程序博客网 时间:2024/05/16 11:04
访问者模式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;@Overridepublic 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;@Overridepublic 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 {@Overridepublic void visitEnterpriseCustomer(EnterpriseCustomer customer) {System.out.println("企业"+customer.getName()+"正在进行偏好分析");}@Overridepublic void visitPersonalCustomer(PersonalCustomer customer) {System.out.println("个人"+customer.getName()+"正在进行偏好分析");}}

/** * 申请服务功能(申请服务的访问者)  * @date 2016年2月27日  */public class ServiceRequestVisitor implements Visitor {@Overridepublic void visitEnterpriseCustomer(EnterpriseCustomer customer) {System.out.println("企业"+customer.getName()+"正在申请服务");}@Overridepublic 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 0