设计模式之访问者模式
2016-03-02 22:43
239 查看
访问者模式Visitor
CRM 客户关系管理
类型:企业客户,个人客户
功能:提出服务申请、客户偏好分析、客户价值分析
问题:系统难以理解、不便于扩展
定义:
表示一个作用于某对象结构中的各元素的操作。
它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
Visitor:
访问者接口,为所有的访问者对象声明一个visit方法,
用来代表为对象添加的功能,理论上可以代表任意的功能
ConcreteVisitor:
具体的访问者实现,实现要真正被添加到对象结构中的功能
Element:
抽象的元素对象
ConcreteElement:具体的元素对象
ObjectStructure:对象结构,通常包含多个被访问的对象
相关代码如下:
受访者接口类:
访问者相关接口类:
代码调用:
运行结果:
整理自教程
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()); } }
运行结果:
企业锤子科技正在申请服务 个人罗永浩正在申请服务 企业锤子科技正在进行偏好分析 个人罗永浩正在进行偏好分析
整理自教程
相关文章推荐
- [读书笔记]《APP研发录》第一章
- Qt的事件机制和用途
- 会计分录的借和贷
- Docker - How to create a custom database from docker mysql image
- 关于linux上使用vi时,方向键出现ABCD的个人总结
- 转行自学android,Day10-顺畅
- 设计具有背景图的按钮(ImageButton的焦点及事件处理)
- 解读Google官方SwipeRefreshLayout控件源码,带你揭秘Android下拉刷新的实现原理
- pthread_create函数
- 一个特别适合新手练习的Android小项目——每日一妹纸
- JVM垃圾回收算法与垃圾回收器
- BFC之浅析篇
- 嵌入式笔试题(linux基础)
- java synchronized详解
- HDU NO.2546 素数回文(筛选法求素数表)
- egcd
- CSS颜色模式转换器的实现
- 【微积分】 04 - 一元积分
- EM35x Development Kit开发环境搭建
- CODEV 4248(NTT[Never Think about Transformation]-大数分解质数)