Java23种设计模式——访问者模式

该系列文章为博主学习笔记,原文请参考参考链接
本文禁止转载,但是欢迎大家留言区留言交流[微笑]

访问者模式特(面)点(试):以不同的方式操作复杂对象结构。访问者模式包含访问者和被访问元素两个主要组成部分,相同的访问者可以以不同的方式访问不同的元素,相同的元素可以接受不同访问者以不同访问方式访问。

例题:
这里写图片描述

//抽象元素
interface Person {
    public void accept(School school);
}
//具体元素
public class Children implements Person {
    //学生姓名
    private String name;
    //学生论文
    private int paper;
    //平均分
    private int average;

    public Children(String name, int paper, int average) {
        this.name = name;
        this.paper = paper;
        this.average = average;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPaper() {
        return paper;
    }

    public void setPaper(int paper) {
        this.paper = paper;
    }

    public int getAverage() {
        return average;
    }

    public void setAverage(int average) {
        this.average = average;
    }

    @Override
    public void accept(School school) {
        school.visit(this);
    }
}
//具体元素
public class Teacher implements Person {
    //教师姓名
    private String name;
    //教师论文
    private int paper;
    //反馈分
    private int feedback;

    public Teacher(String name, int paper, int feedback) {
        this.name = name;
        this.paper = paper;
        this.feedback = feedback;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPaper() {
        return paper;
    }

    public void setPaper(int paper) {
        this.paper = paper;
    }

    public int getFeedback() {
        return feedback;
    }

    public void setFeedback(int feedback) {
        this.feedback = feedback;
    }

    @Override
    public void accept(School school) {
        school.visit(this);
    }
}
//学校类:访问者
public abstract class School {
    public abstract void visit(Children person);
    public abstract void visit(Teacher person);
}
//学生处类,用于统计学生平局分数和老师的反馈分数:具体访问者
public class StudentDepartment extends School{
    @Override
    public void visit(Children person) {
        String name = person.getName();
        int average = person.getAverage();
        if (average>90){
            System.out.println("姓名 "+name+"  可以评选成绩优秀奖");
        }
    }

    @Override
    public void visit(Teacher person) {
        String name = person.getName();
        int feedback = person.getFeedback();
        if (feedback>90){
            System.out.println("姓名 "+name+"  可以评选成绩优秀奖");
        }
    }
}
//教导处类,用于统计学生和老师的论文数量:具体访问者
public class EducationDepartment extends School{

    @Override
    public void visit(Children person) {
        String name = person.getName();
        int paper = person.getPaper();
        if (paper>2){
            System.out.println("姓名 "+name+"  可以评选科研奖");
        }
    }

    @Override
    public void visit(Teacher person) {
        String name = person.getName();
        int paper = person.getPaper();
        if (paper>10){
            System.out.println("姓名 "+name+"  可以评选科研奖");
        }
    }
}
//对象结构
public class StudentList {
    private ArrayList<Person> list = new ArrayList<Person>();

    public void addPerson(Person person) {
        list.add(person);
    }

    public void accept(School school) {
        for (Object obj : list) {
            ((Person) obj).accept(school);
        }
    }
}
public class MyClass {
    public static void main(String[] args) {
        StudentList studentList = new StudentList();

        Person person1, person2, person3, person4;
        person1 = new Children("小王", 1, 89);
        person2 = new Children("小李", 3, 92);
        person3 = new Teacher("王老师", 11, 99);
        person4 = new Teacher("张老师", 7, 60);

        studentList.addPerson(person1);
        studentList.addPerson(person2);
        studentList.addPerson(person3);
        studentList.addPerson(person4);

        EducationDepartment educationDepartment = new EducationDepartment();
        studentList.accept(educationDepartment);
    }
}

输出:
姓名 小李 可以评选科研奖
姓名 王老师 可以评选科研奖

该模式主要通过StudentList类,存储了所有被访问的对象(被访问的对象可能不止一种,通过集合添加,这里为Children和Teacher两个类)。通过调用accept方法,里面传入的是访问者。本例子中传入的是EducationDepartment(教导处对象,分别对学生和老师的论文数量进行处理,判断是否可以评选科研奖)。之后分别调用了Children和Teacher两个对象中的accept方法(并传入this对象),最后调用了访问者(EducationDepartment)类中的visit方法,分别对教师类和孩子类进行处理。

微信公众号:
这里写图片描述

QQ交流群:365473065

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值