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

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 行为型模式 -- 访问者模式相关的知识,希望对你有一定的参考价值。

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

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 缺点


适用场景

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


以上是关于设计模式 行为型模式 -- 访问者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)

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

Python 设计模式 — 行为型模式 — 访问者模式

Python 设计模式 — 行为型模式 — 访问者模式

JAVA SCRIPT设计模式--行为型--设计模式之Vistor访问者(23)

JAVA SCRIPT设计模式--行为型--设计模式之Vistor访问者(23)