设计模式 行为型模式 -- 访问者模式

设计模式 行为型模式 – 访问者模式 拓展:双分派

1. 访问者模式


1.1 引入

在这里插入图片描述

分析:

在这里插入图片描述
在这里插入图片描述


1.2 定义

在这里插入图片描述
在这里插入图片描述


1.3 结构

在这里插入图片描述

主要角色:

在这里插入图片描述


1.3.1 典型的抽象访问者类代码

在这里插入图片描述


1.3.2 典型的具体访问者类代码

在这里插入图片描述


1.3.3 典型的抽象元素类代码

在这里插入图片描述


1.3.4 典型的具体元素类代码

在这里插入图片描述


1.3.5 典型的对象结构代码

在这里插入图片描述


1.4 访问者模式实现原理: 双重分派机制

在这里插入图片描述

在这里插入图片描述


1.5【例】给宠物喂食

现在养宠物的人特别多,我们就以这个为例,当然宠物还分为狗,猫等,要给宠物喂食的话,主人可以喂,其他人也可以喂食。

角色分析:

  • 抽象访问者角色:给宠物喂食的人
  • 具体访问者角色:主人、其他人
  • 抽象元素角色:动物抽象类
  • 具体元素角色:宠物狗、宠物猫
  • 结构对象角色:主人家

类图如下:

在这里插入图片描述

代码实现:

Person.java

package com.tian.visitor;

/**
 * @version v1.0
 * @ClassName: Person
 * @Description: 抽象访问者角色类
 */
public interface Person {

    //喂食宠物狗
    void feed(Cat cat);

    //喂食宠物猫
    void feed(Dog dog);
}

Animal.java

package com.tian.visitor;

/**
 * @version v1.0
 * @ClassName: Animal
 * @Description: 抽象元素角色类
 */
public interface Animal {
    //接受访问者访问的功能
    void accept(Person person);
}

Cat.java

package com.tian.visitor;

/**
 * @version v1.0
 * @ClassName: Cat
 * @Description: 具体元素角色类(宠物猫)
 */
public class Cat implements Animal {
    public void accept(Person person) {
        person.feed(this); //访问者给宠物猫喂食
        System.out.println("好好吃,喵喵喵。。。");
    }
}

Dog.java

package com.tian.visitor;

/**
 * @version v1.0
 * @ClassName: Cat
 * @Description: 具体元素角色类(宠物狗)
 */
public class Dog implements Animal {
    public void accept(Person person) {
        person.feed(this); //访问者给宠物猫喂食
        System.out.println("好好吃,汪汪汪。。。");
    }
}

Owner.java

package com.tian.visitor;

/**
 * @version v1.0
 * @ClassName: Owner
 * @Description: 具体访问者角色类(主人)
 */
public class Owner implements Person {

    public void feed(Cat cat) {
        System.out.println("主人喂食猫");
    }

    public void feed(Dog dog) {
        System.out.println("主人喂食狗");
    }
}

Someone.java

package com.tian.visitor;

/**
 * @version v1.0
 * @ClassName: Owner
 * @Description: 具体访问者角色类(其他人)
 */
public class Someone implements Person {

    public void feed(Cat cat) {
        System.out.println("其他人喂食猫");
    }

    public void feed(Dog dog) {
        System.out.println("其他人喂食狗");
    }
}

Home.java

package com.tian.visitor;

import java.util.ArrayList;
import java.util.List;

/**
 * @version v1.0
 * @ClassName: Home
 * @Description: 对象结构类
 */
public class Home {

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

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

    public void action(Person person) {
        //遍历集合,获取每一个元素,让访问者访问每一个元素
        for (Animal animal : animalList) {
            animal.accept(person);
        }
    }
}
package com.tian.visitor;

/**
 * @version v1.0
 * @ClassName: Client
 * @Description: 客户端类:测试类
 */
public class Client {
    public static void main(String[] args) {
        //创建Home对象
        Home home = new Home();
        //添加元素到Home对象中
        home.add(new Dog());
        home.add(new Cat());

        //创建主人对象
        Owner owner = new Owner();
        //创建其他人对象
        Someone someone = new Someone();
        //让主人喂食所有的宠物
        home.action(owner);
        //让其他人喂食所有的宠物
        home.action(someone);
    }
}

1.5.1 运行结果

在这里插入图片描述


1.6 优缺点分析 适用场景


1.6.1 优点

在这里插入图片描述


1.6.2 缺点

在这里插入图片描述


适用场景

  • 对象结构相对稳定,但其操作算法经常变化的程序。
  • 对象结构中的对象需要提供多种不同且不相关的操作,而且要避免让这些操作的变化影响对象的结构。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值