Java 设计模式 之 访问者模式(Visitor)_第1页
Java 设计模式 之 访问者模式(Visitor)_第2页
Java 设计模式 之 访问者模式(Visitor)_第3页
Java 设计模式 之 访问者模式(Visitor)_第4页
Java 设计模式 之 访问者模式(Visitor)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java 设计模式 之 访问者模式(Visitor)商家如何收集用户的反馈意见 一个生产高能电池的厂家,下设一个客户服务部门,其主要任务之一就是收集用户的反馈意见,以便改进产品功能和服务质量。 以前,客户服务部门只是采用发放调查问卷的方式。调查问卷的问题千篇一律,不能针对特殊用户的兴趣点,尤其一些集体用户,不会认真对待这些问卷,懒得把问卷发到具体的使用者手里,而且,很多用户不愿意花时间把调查问卷寄回。调查结果不全面,不真实,几乎没有任何效果。商家如何收集用户的反馈意见? 之后,个性化服务、CRM客户关系管理等概念兴起,客户服务部门引入了一套CRM客户(用户)关系管理系统,对客户信息进行管理。针

2、对不同用户的特点,采用不同的调查方式。采用电话、E-Mail、传真、问卷、登门拜访等多种方式,对用户进行调查访问。针对一些集体用户,比如,企事业单位用户,客户服务人员首先访问联系该单位集体,安排好时间之后,客户服务人员具体访问每一个具体用户,这些用户接受客户服务人员的访问,给出亲身使用电池产品的第一手资料 我们可以看到,这是一个典型的Visitor Pattern。客户服务部门就是Visitor,不同类型的用户就是被访问者。客户服务部门(Visitor)几乎做了所有的工作,尽量不给用户增加负担。定义 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素

3、的新操作。 从定义可以看出结构对象是使用访问者模式必备条件,而且这个结构对象必须存在遍历自身各个对象的方法。这便类似于Java语言当中的collection概念了。 本质:预留通路,实现回调。涉及角色1.IVisitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具休访问者的具休元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。2.ConcreteVisitor.具体访问者角色,实现Visitor声明的接口。3.Element 定义一个接受访问操作(accept(),它以一个访问者(Visitor)作为参数。4.Con

4、creteElement 具体元素,实现了抽象元素(Element)所定义的接受操作接口。涉及角色5.ObjectStructure 结构对象角色,这是使用访问者模式必备的角色。它具备以下特性: 能枚举它的元素; 可以提供一个高层接口以允许访问者访问它的元素; 如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。示例IVisitor Visitor public interface Visitor public void visitEnterpriseCustomer(EnterpriseCustomer ec); public void visitPersonalCusto

5、mer(PersonalCustomer pc); ConcreteVisitorPredilectionAnalyzeVisitorpublic class PredilectionAnalyzeVisitor implements Visitor public void visitEnterpriseCustomer(EnterpriseCustomer ec) System.out.println(现在对企业客户 + ec.getName() + 进行产品偏好分析); public void visitPersonalCustomer(PersonalCustomer pc) Syste

6、m.out.println(现在对个人客户 + pc.getName() + 进行产品偏好分析); ConcreteVisitorServiceRequestVisitorpublic class ServiceRequestVisitor implements Visitor public void visitEnterpriseCustomer(EnterpriseCustomer ec) System.out.println(ec.getName() + 企业提出服务请求); public void visitPersonalCustomer(PersonalCustomer pc) S

7、ystem.out.println(客户 + pc.getName() + 提出服务请求); Element Customer public abstract class Customer private String customerId; private String name; public String getCustomerId() return customerId; public void setCustomerId(String customerId) this.customerId = customerId; public String getName() return na

8、me; public void setName(String name) = name; public abstract void accept(Visitor visitor); ConcreteElementEnterpriseCustomerpublic class EnterpriseCustomer extends Customer private String linkman; private String linkTelephone; private String registerAddress; public String getLinkman() retu

9、rn linkman; public void setLinkman(String linkman) this.linkman = linkman; public String getLinkTelephone() return linkTelephone; ConcreteElementEnterpriseCustomer public void setLinkTelephone(String linkTelephone) this.linkTelephone = linkTelephone; public String getRegisterAddress() return registe

10、rAddress; public void setRegisterAddress(String registerAddress) this.registerAddress = registerAddress; public void accept(Visitor visitor) visitor.visitEnterpriseCustomer(this); ConcreteElementPersonalCustomerpublic class PersonalCustomer extends Customer private String telephone; private int age;

11、 public String getTelephone() return telephone; public void setTelephone(String telephone) this.telephone = telephone; public int getAge() return age; ConcreteElementPersonalCustomerpublic void setAge(int age) this.age = age; public void accept(Visitor visitor) visitor.visitPersonalCustomer(this); O

12、bjectStructure ObjectStructurepublic class ObjectStructure private Collection col = new ArrayList(); public void handleRequest(Visitor visitor) for(Customer cm : col) cm.accept(visitor); public void addElement(Customer ele) this.col.add(ele); Clientpublic class Client public static void main(String

13、args) ObjectStructure os = new ObjectStructure(); Customer cml = new EnterpriseCustomer(); cml.setName(ABC集团); os.addElement(cml); Customer cm2 = new EnterpriseCustomer(); cm2.setName(CDE公司); os.addElement(cm2); Customer cm3 = new PersonalCustomer(); cm3.setName(张三); os.addElement(cm3); ClientServic

14、eRequestVisitor srVisitor = new ServiceRequestVisitor(); os.handleRequest(srVisitor); PredilectionAnalyzeVisitor paVisitor = new PredilectionAnalyzeVisitor(); os.handleRequest(paVisitor); 测试结果访问者模式的优点 好的扩展性:能在不修改对象结构的前提下,为对象结构中的元素添加新功能。 好的复用性:可以通过访问者来定义整个对象结构通用的功能,从而提高复用的程度。 分离无关行为:把相关的行为封装在一起,构成一个访问者,这样每个访问者都比较单一。访问者模式的缺点 对象结构很难变化:不适用于对象结构中类经常变化的情况,因为对象结构发生了改变,访问者的接口和访问者得实现都要发生相应的改变,代价太高。 破坏封装:通常需要对象结构开放内部数据给访问者,ObjectStructure破坏了对象的封装性。适用情况 1) 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。 2)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论