设计模式之访问者模式

访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。

访问者模式建议将新行为放入一个名为_访问者_的独立类中, 而不是试图将其整合到已有类中。 现在, 需要执行操作的原始对象将作为参数被传递给访问者中的方法, 让方法能访问对象所包含的一切必要数据。

访问者模式结构

访问者 (Visitor) 接口声明了一系列以对象结构的具体元素为参数的访问者方法。 如果编程语言支持重载, 这些方法的名称可以是相同的, 但是其参数一定是不同的。

具体访问者 (Concrete Visitor) 会为不同的具体元素类实现相同行为的几个不同版本。

元素 (Element) 接口声明了一个方法来 “接收” 访问者。 该方法必须有一个参数被声明为访问者接口类型。

具体元素 (Concrete Element) 必须实现接收方法。 该方法的目的是根据当前元素类将其调用重定向到相应访问者的方法。 请注意, 即使元素基类实现了该方法, 所有子类都必须对其进行重写并调用访问者对象中的合适方法。

客户端 (Client) 通常会作为集合或其他复杂对象 (例如一个组合树) 的代表。 客户端通常不知晓所有的具体元素类, 因为它们会通过抽象接口与集合中的对象进行交互。

JAVA 示例代码:

import java.util.*;

public class VisitorPattern {

    public static void main(String\[\] args) {

        PersonStructure structure = new PersonStructure();

        Visitor1 visitor1 = new Visitor1();

        System.out.println("访问者1的访问记录:");

        structure.Accept(visitor1);

        System.out.println("学生年龄的总和:" + visitor1.getStudentAgeSum() + " 老师年龄的总和:" + visitor1.getTeacherAgeSum());

        System.out.println("=========================================");

        Visitor2 visitor2 = new Visitor2();

        System.out.println("访问者2的访问记录:");

        structure.Accept(visitor2);

        System.out.println("学生的最高成绩:" + visitor2.getMaxScore() + " 老师的最高工龄:" + visitor2.getMaxWorkYear());

    }

}

interface Visitor {

    public void visitStudent(Student student); // 访问学生

    public void visitTeacher(Teacher teacher); // 访问老师

}

class Visitor1 implements Visitor { // 访问者1 分别统计学生和老师的年龄总和

    private int studentAgeSum = 0;

    private int teacherAgeSum = 0;

    public int getStudentAgeSum() {

        return studentAgeSum;

    }

    public int getTeacherAgeSum() {

        return teacherAgeSum;

    }

    @Override

    public void visitStudent(Student student) {

        System.out.println("访问者1访问学生:" + student.getName() + " 年龄:" + student.getAge());

        studentAgeSum += student.getAge();

    }

    @Override

    public void visitTeacher(Teacher teacher) {

        System.out.println("访问者1访问老师:" + teacher.getName() + " 年龄:" + teacher.getAge());

        teacherAgeSum += teacher.getAge();

    }

}

class Visitor2 implements Visitor { // 访问者2 分别求出 学生的最高成绩 以及 老师的最高工龄

    private int maxScore = -1;

    private int maxWorkYear = -1;

    public int getMaxScore() {

        return maxScore;

    }

    public int getMaxWorkYear() {

        return maxWorkYear;

    }

    @Override

    public void visitStudent(Student student) {

        System.out.println("访问者2访问学生:" + student.getName() + " 成绩:" + student.getScore());

        maxScore = Math.max(maxScore, student.getScore());

    }

    @Override

    public void visitTeacher(Teacher teacher) {

        System.out.println("访问者2访问老师:" + teacher.getName() + " 工龄:" + teacher.getWorkYear());

        maxWorkYear = Math.max(maxWorkYear, teacher.getWorkYear());

    }

}

class PersonStructure {

    private List<Person> personList = new ArrayList<Person>();

    public PersonStructure() {

        personList.add(new Student("张三", 20, 70));

        personList.add(new Student("李四", 21, 80));

        personList.add(new Student("王五", 22, 90));

        personList.add(new Teacher("李老师", 26, 3));

        personList.add(new Teacher("陈老师", 27, 4));

        personList.add(new Teacher("刘老师", 28, 5));

    }

    public void Accept(Visitor visitor) {

        // for (遍历对象类型 对象名 : 遍历对象)

        for (Person person : personList) {

            person.Accept(visitor);

        }

    }

}

abstract class Person {

    private String name;

    private int age;

    public Person(String name, int age) {

        this.name = name;

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public int getAge() {

        return age;

    }

    public abstract void Accept(Visitor visitor);

}

class Student extends Person {

    private int score;

    public Student(String name, int age, int score) {

        super(name, age);

        this.score = score;

    }

    public int getScore() {

        return score;

    }

    @Override

    public void Accept(Visitor visitor) {

        visitor.visitStudent(this);

    }

}

class Teacher extends Person {

    private int workYear;

    public Teacher(String name, int age, int workYear) {

        super(name, age);

        this.workYear = workYear;

    }

    public int getWorkYear() {

        return workYear;

    }

    @Override

    public void Accept(Visitor visitor) {

        visitor.visitTeacher(this);

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

flysh05

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

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

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

打赏作者

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

抵扣说明:

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

余额充值