设计模式之访问者模式

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

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

访问者模式结构

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

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

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

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

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

设计模式之访问者模式_第1张图片

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

    }

}

你可能感兴趣的:(软件设计师考试,访问者模式,设计模式,java)