您现在的位置是:首页 > 编程 > 

设计模式(二十一):行为型之访问者模式

2025-07-21 16:27:43
设计模式(二十一):行为型之访问者模式 一、设计模式分类创建型模式 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式结构型模式 用于描述如何将类或对象按某种布局组成更大的结构提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的

设计模式(二十一):行为型之访问者模式

一、设计模式分类
  • 创建型模式
    • 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”
    • 提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式
  • 结构型模式
    • 用于描述如何将类或对象按某种布局组成更大的结构
    • 提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式
  • 行为型模式
    • 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责
    • 提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器 11 种行为型模式
二、访问者模式

1、概述

定义

  • 封装一些作用于某种数据结构中的各元素的操作
  • 它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作

2、结构

访问者模式包含以下主要角:

  • 抽象访问者(Visitor)角:定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的,从这点不难看出,访问者模式要求元素类的个数不能改变
  • 具体访问者(ConcreteVisitor)角:给出对每一个元素类访问时所产生的具体行为
  • 抽象元素(Element)角:定义了一个接受访问者的方法(accept),其意义是指,每一个元素都要可以被访问者访问
  • 具体元素(ConcreteElement)角: 提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法
  • 对象结构(Object Structure)角:定义当中所提到的对象结构,对象结构是一个抽象表述,具体点可以理解为一个具有容器性质或者复合对象特性的类,它会含有一组元素(Element),并且可以迭代这些元素,供访问者访问

、实现

【例】给宠物喂食

  • 宠物还分为狗,猫等,要给宠物喂食的话
  • 主人可以喂,其他人也可以喂食
  • 访问者角:给宠物喂食的人
  • 具体访问者角:主人、其他人
  • 抽象元素角:动物抽象类
  • 具体元素角:宠物狗、宠物猫
  • 结构对象角:主人家

类图如下:

代码如下:

  • 创建抽象访问者接口
代码语言:javascript代码运行次数:0运行复制
public interface Person {
    //喂食宠物狗
    void feed(Cat cat);
    //喂食宠物猫
    void feed(Dog dog);
}
  • 创建不同的具体访问者角(主人和其他人),都需要实现 Person接口
代码语言:javascript代码运行次数:0运行复制
public class Owner implements Person {

    @Override
    public void feed(Cat cat) {
        println("主人喂食猫");
    }

    @Override
    public void feed(Dog dog) {
        println("主人喂食狗");
    }
}

public class Someone implements Person {
    @Override
    public void feed(Cat cat) {
        println("其他人喂食猫");
    }

    @Override
    public void feed(Dog dog) {
        println("其他人喂食狗");
    }
}
  • 定义抽象节点 – 宠物
代码语言:javascript代码运行次数:0运行复制
public interface Animal {
    //接受访问者访问的功能
    void accept(Person person);
}
  • 定义实现Animal接口的 具体节点(元素)
代码语言:javascript代码运行次数:0运行复制
public class Dog implements Animal {

    @Override
    public void accept(Person person) {
    	//访问者给宠物狗喂食
        person.feed(this);
        println("好好吃,汪汪汪!!!");
    }
}

public class Cat implements Animal {

    @Override
    public void accept(Person person) {
    	//访问者给宠物猫喂食
        person.feed(this);
        println("好好吃,喵喵喵!!!");
    }
}
  • 定义对象结构,此案例中就是主人的家
代码语言:javascript代码运行次数:0运行复制
public class Home {

    //声明一个集合对象,用来存储元素对象
    private List<Animal> nodeList = new ArrayList<Animal>();

    //添加元素功能
    public void add(Animal animal) {
        nodeList.add(animal);
    }

    public void action(Person person) {
        //遍历集合,获取每一个元素,让访问者访问每一个元素
        for (Animal animal : nodeList) {
            animal.accept(person);
        }
    }
}
  • 测试类
代码语言:javascript代码运行次数:0运行复制
public class Client {
    public static void main(String[] args) {
        Home home = new Home();
        home.add(new Dog());
        home.add(new Cat());

        Owner owner = new Owner();
        home.action(owner);

        Someone someone = new Someone();
        home.action(someone);
    }
}

4、优缺点

优点

  • 扩展性好,在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能
  • 复用性好,通过访问者来定义整个对象结构通用的功能,从而提高复用程度
  • 分离无关行为,通过访问者来分离无关的行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一

缺点

  • 对象结构变化很困难,在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”
  • 违反了依赖倒置原则,访问者模式依赖了具体类,而没有依赖抽象类

5、使用场景

  • 对象结构相对稳定,但其操作算法经常变化的程序
  • 对象结构中的对象需要提供多种不同且不相关的操作,而且要避免让这些操作的变化影响对象的结构
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-06-26,如有侵权请联系 cloudcommunity@tencent 删除集合接口设计模式public对象

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1161645.html

相关标签:无
上传时间: 2025-07-20 17:21:52
留言与评论(共有 18 条评论)
本站网友 高级公寓
20分钟前 发表
猫等
本站网友 哭和笑有什么共同之处
28分钟前 发表
把相关的行为封装在一起
本站网友 飞速土豆
22分钟前 发表
桥接
本站网友 西平二手房出售
14分钟前 发表
原型
本站网友 徐震超市
20分钟前 发表
都要在每一个具体访问者类中增加相应的具体操作
本站网友 高端奶粉品牌
12分钟前 发表
中介者
本站网友 奇犽
23分钟前 发表
其意义是指
本站网友 多万
27分钟前 发表
供访问者访问
本站网友 瞎子点灯
16分钟前 发表
抽象工厂
本站网友 种植牙齿价格
29分钟前 发表
但其操作算法经常变化的程序对象结构中的对象需要提供多种不同且不相关的操作
本站网友 无锡团购
28分钟前 发表
它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的
本站网友 法国瓦岱勒
27分钟前 发表
构成一个访问者
本站网友 海尔电热水器漏电
10分钟前 发表
解释器 11 种行为型模式二
本站网友 婴儿囟门
4分钟前 发表
汪汪汪!!!"); } } public class Cat implements Animal { @Override public void accept(Person person) { //访问者给宠物猫喂食 person.feed(this); println("好好吃
本站网友 精油的正确使用方法
23分钟前 发表
通过访问者来分离无关的行为
本站网友 亿房网武汉
26分钟前 发表
把相关的行为封装在一起
本站网友 连翘败毒膏
17分钟前 发表
如有侵权请联系 cloudcommunity@tencent 删除前往查看集合接口设计模式public对象