博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[设计模式]访问者模式
阅读量:4340 次
发布时间:2019-06-07

本文共 4738 字,大约阅读时间需要 15 分钟。

1.定义

  访问者模式一种将算法和软件结构分离的设计模式。

  基本思想是:首先我们拥有一个由许多对象构成的对象结构,这些对象的类对拥有一个accept方法来接受访问者对象。访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作为不同的反应。在对象结构的一次访问中,我们遍历整个对象结构,对每个元素都实施accept方法,在每个元素accept方法中回调访问者的visit方法,从而使访问者得以处理对象结构中的每一个元素。我们可以通过对对象结构设计不同的具体的访问者来完成不同的操作。

2. 类图

  

3. 实例

  

package com.jerry.designpattern;/** *  * @author Jerry * @date 2015年2月10日 下午11:21:05 */public abstract class Customer {    protected String id;    protected String name;        public abstract void accept(Visitor visitor);    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}package com.jerry.designpattern;/** *  * @author Jerry * @date 2015年2月10日 下午11:22:48 */public class EnterpriseCustomer extends Customer{    private String linkName;    private String linkPhone;    private String registerAddress;        @Override    public void accept(Visitor visitor) {        // TODO Auto-generated method stub        visitor.visitEnterpriseCustomer(this);    }    public String getLinkName() {        return linkName;    }    public void setLinkName(String linkName) {        this.linkName = linkName;    }    public String getLinkPhone() {        return linkPhone;    }    public void setLinkPhone(String linkPhone) {        this.linkPhone = linkPhone;    }    public String getRegisterAddress() {        return registerAddress;    }    public void setRegisterAddress(String registerAddress) {        this.registerAddress = registerAddress;    }}package com.jerry.designpattern;/** *  * @author Jerry * @date 2015年2月10日 下午11:26:37 */public class PersonalCustomer extends Customer{        private String phone;    private int age;        @Override    public void accept(Visitor visitor) {        // TODO Auto-generated method stub        visitor.visitPersonalCustomer(this);    }    public String getPhone() {        return phone;    }    public void setPhone(String phone) {        this.phone = phone;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}package com.jerry.designpattern;/** *  * @author Jerry * @date 2015年2月10日 下午11:23:40 */public interface Visitor {    void visitPersonalCustomer(PersonalCustomer personalCustomer);        void visitEnterpriseCustomer(EnterpriseCustomer enterpriseCustomer);}package com.jerry.designpattern;/** *  * @author Jerry * @date 2015年2月10日 下午11:34:14 */public class PredilectionAnalyzeVisitor implements Visitor{        @Override    public void visitEnterpriseCustomer(EnterpriseCustomer enterpriseCustomer) {        // TODO Auto-generated method stub        System.out.println("现在对企业客户<" + enterpriseCustomer.getName() + ">进行产品偏好分析");    }        public void visitPersonalCustomer(PersonalCustomer personalCustomer) {        System.out.println("现在对个人客户<" + personalCustomer.getName() + ">进行产品偏好分析");    };}package com.jerry.designpattern;/** *  * @author Jerry * @date 2015年2月10日 下午11:29:54 */public class ServiceRequestVisitor implements Visitor{    @Override    public void visitPersonalCustomer(PersonalCustomer personalCustomer) {        // TODO Auto-generated method stub        System.out.println(personalCustomer.getName() + "提出服务请求");    }    @Override    public void visitEnterpriseCustomer(EnterpriseCustomer enterpriseCustomer) {        // TODO Auto-generated method stub        System.out.println(enterpriseCustomer.getName() + "企业提出服务请求");    }}package com.jerry.designpattern;/** *  * @author Jerry * @date 2015年2月10日 下午11:38:24 */public class Client {    public static void main(String[] args) {        ObjectStructure objectStructure = new ObjectStructure();                Customer c1 = new PersonalCustomer();        c1.setName("孙悟空");        objectStructure.addElement(c1);                Customer c2 = new EnterpriseCustomer();        c2.setName("花果山科技有限公司");        objectStructure.addElement(c2);                Customer c3 = new PersonalCustomer();        c3.setName("猪悟能");        objectStructure.addElement(c3);                Customer c4 = new EnterpriseCustomer();        c4.setName("高老庄房地产集团");        objectStructure.addElement(c4);                Visitor v1 = new ServiceRequestVisitor();        objectStructure.handle(v1);                Visitor v2 = new PredilectionAnalyzeVisitor();        objectStructure.handle(v2);    }}

4. 优缺点

  访问者优点:好的扩展性、好的复用性、分离无关行为。

  访问者缺点:对象结构变化很困难、破坏了对象的封装性。

5. 试用场景

  以下情况下可以使用访问者呢?

  如果想对一个对象结构中实施一些依赖对象结构中具体类的操作,可以使用访问者模式。

  如果想对一个对象结构中进行很多不同且不相关的操作,为了避免这些操作使类变得杂乱,可以使用访问者模式,把这些操作分散到不同的访问者对象中,每个访问者实现同一类功能。

  如果对象结构很少变动,但是需要经常给对象结构中的元素对象定义新的操作,可以使用访问者模式。

转载于:https://www.cnblogs.com/jerry19890622/p/4314720.html

你可能感兴趣的文章
知道这20个正则表达式,能让你少写1,000行代码
查看>>
MariaDB 主从同步与热备(14)
查看>>
推荐的 CSS 书写顺序
查看>>
NIO:与 Buffer 一起使用 Channel
查看>>
Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
查看>>
MFC接收ShellExecute多个参数
查看>>
volatile和synchronized的区别
查看>>
RocketMQ介绍与云服务器安装
查看>>
并发量计算研究
查看>>
sqlserver安装相关问题
查看>>
iOS学习系列 - 利用ASIHTTPRequest实现异步队列
查看>>
Oracle11g创建表空间、创建用户、角色授权、导入导出表以及中文字符乱码问题...
查看>>
我对 Window.Open 的认识
查看>>
restore db from production copy
查看>>
jQuery源码的基础知识
查看>>
BZOJ 2049 [Sdoi2008]Cave 洞穴勘测(动态树)
查看>>
LeetCode 第21题 合并有序链表
查看>>
类中的静态函数和非静态函数的区别
查看>>
windows 下安装Apache
查看>>
yii2关闭(开启)csrf的验证
查看>>