18、访问者模式

该博客介绍了一个使用访问者模式设计的宠物喂食系统,系统中包括了不同类型的宠物(如狗、猫)和不同角色的喂食者(如主人、其他人)。通过访问者模式,实现了喂食行为的分离,使得喂食操作可以灵活地应用到不同的宠物对象上,增强了系统的可扩展性。

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

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

在这里插入图片描述

//抽象元素角色类
public interface Animal {
    //接受访问者访问的功能
    void accept(Person person);
}

//抽象访问者角色类
public interface Person {
    void feed(Cat cat);
    //喂食宠物狗
    void feed(Dog dog);
}

//具体元素角色类(宠物狗)
public class Dog implements Animal{

    @Override
    public void accept(Person person) {
        //访问者给宠物狗喂食
        person.feed(this);
        System.out.println("汪汪汪  好好吃");
    }
}
//具体元素角色类(宠物猫)2
public class Cat implements Animal {
    @Override
    public void accept(Person person) {
        //访问者给宠物mao喂食
        person.feed(this);
        System.out.println("喵喵喵  好好吃");
    }
}

//具体访问者角色类(自己)
public class Owner implements Person {
    @Override
    public void feed(Cat cat) {
        System.out.println("主人喂食猫");
    }

    @Override
    public void feed(Dog dog) {
        System.out.println("主人喂食狗");
    }
}
//具体访问者角色类(其他人)
public class Someone implements Person {

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

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

//对象结构类
public class Home {
    //声明一个集合对象,用来存储元素对象
    private List<Animal> nodeList=new ArrayList<>();
    //添加元素功能
    public void add(Animal animal) {
        nodeList.add(animal);
    }

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

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

在这里插入图片描述
在这里插入图片描述
双分排

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值