设计模式 访问者模式


定义


案例

定义访问者接口和实现类

public interface Person {
    public void feed(Dog dog);

    public void feed(Cat cat);
}
public class Owner implements Person{
    @Override
    public void feed(Dog dog) {
        System.out.println("主人喂狗");
    }

    @Override
    public void feed(Cat cat) {
        System.out.println("主人喂猫");
    }
}
public class SomeOne implements Person{
    @Override
    public void feed(Dog dog) {
        System.out.println("其他人喂狗");
    }

    @Override
    public void feed(Cat cat) {
        System.out.println("其他人喂狗");
    }
}

定义宠物类

public interface Animal {
    void accept(Person person);
}
public class Cat implements Animal{
    @Override
    public void accept(Person person) {
        person.feed(this);
        System.out.println("喵喵喵");
    }
}
public class Dog implements Animal{
    @Override
    public void accept(Person person) {
        person.feed(this);
        System.out.println("汪汪汪");
    }
}

定义对象结构

public class Home {
    private List nodeList = new ArrayList<>();

    public void action(Person person){
        for(Animal animal : nodeList){
            animal.accept(person);
        }
    }

    public void add(Animal animal){
        nodeList.add(animal);
    }
}

测试:

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);
    }
}

总结