Java设计模式--访问者模式

访问者模式(别名:虚拟构造)

表示一个作用于某对象结构中的各个元素的操作。它可以在不改变各个元素的类的前提下定义作用于这些元素的新操作。

Visitor Pattern

Represent an operation to be preformed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operator.

类图

模式的结构与使用

访问者模式的结构中包括五种角色。
+ 抽象元素(Element):一个抽象类,该类定义了接口访问者的accept操作。
+ 具体元素(Concrete Element):Element的子类。
+ 对象结构(Object Structure):一个集合,用于存放Element对象,提供遍历它自己的方法。
+ 抽象访问者(Visitor):一个接口,该接口定义操作对象(Concrete Element的实例)的方法。

简单的例子

Element的抽象类Student.java

package Visitor;

public abstract class Student {
    public abstract void accept(Visitor v);
}

ConcreteElement的实现类GraduateStudent.java

package Visitor;

public class GraduateStudent extends Student {

    private double math,english,physics;
    private String name;

    public GraduateStudent(double math, double english, double physics,
            String name) {
        this.math = math;
        this.english = english;
        this.physics = physics;
        this.name = name;
    }

    public double getMath() {
        return math;
    }

    public double getEnglish() {
        return english;
    }

    public double getPhysics() {
        return physics;
    }

    public String getName() {
        return name;
    }

    @Override
    public void accept(Visitor v) {
        v.visit(this);
    }
}

ConcreteElement的实现类Undergraduate.java

package Visitor;

public class Undergraduate extends Student {

    private double math,english;
    private String name;

    public Undergraduate(double math, double english, String name) {
        this.math = math;
        this.english = english;
        this.name = name;
    }

    public double getMath() {
        return math;
    }

    public double getEnglish() {
        return english;
    }

    public String getName() {
        return name;
    }

    @Override
    public void accept(Visitor v) {
        v.visit(this);
    }
}

Visitor的接口类Visitor.java

package Visitor;

public interface Visitor {
    public void visit(Undergraduate stu);
    public void visit(GraduateStudent stu);
}

ConcreteVisitor的实现类Company.java

package Visitor;

public class Company implements Visitor {

    @Override
    public void visit(Undergraduate stu) {
        double math = stu.getMath();
        double english = stu.getEnglish();
        if (math > 80 && english > 90) {
            System.out.println(stu.getName() + "被录用");
        }
    }

    @Override
    public void visit(GraduateStudent stu) {
        double math = stu.getMath();
        double english = stu.getEnglish();
        double physics = stu.getPhysics();
        if (math > 80 && english > 90 && physics > 70) {
            System.out.println(stu.getName() + "被录用");
        }
    }
}

测试类Application.java

package Visitor;

import java.util.ArrayList;
import java.util.Iterator;

public class Application {

    public static void main(String[] args) {
        Visitor visitor = new Company();
        ArrayList<Student> studentList = new ArrayList<Student>();
        studentList.add(new Undergraduate(88, 67, "张三"));
        studentList.add(new Undergraduate(90, 98, "李四"));
        studentList.add(new Undergraduate(85, 92, "王五"));
        studentList.add(new GraduateStudent(88, 70, 87, "赵六"));
        studentList.add(new GraduateStudent(90, 95, 82, "周吴"));
        Iterator<Student> iter = studentList.iterator();
        while (iter.hasNext()) {
            Student stu = iter.next();
            stu.accept(visitor);
        }
    }
}

执行效果图

双重分派

访问者模式在不改变类的情况下可有效地增加其上的操作,为了达到这样的效果,使用了一种称为“双重分派”的技术:在访问者模式中,被访问者,即Element角色element,首先调用accept(Visitor visitor)方法接受访问者,而被接受的访问者visitor再调用visit(Element element)方法访问当前对象。

访问者模式的优点

  • 可以在不改变一个集合中元素的类的情况下,增加新的施加于该元素上的新操作。
  • 可以将集合中各个元素的某些操作集中到访问者中,不仅便于集合的维护,也有利于集合中元素的复用。
    注:在访问者模式中,每增加一个Element角色的子类,都意味着需要在Visitor角色中给出访问该子类的实例的visit()的方法。

适用访问者模式的情景

  • 一个对象结构中,比如某个集合中,包含很多对象,想对集合中的对象增加一些新的操作。
  • 需要对集合中的对象进行很多不同的并且不相关的操作,而又不想修改对象的类,就可以使用访问者模式。访问者模式可以在Visitor类中集中定义一些关于集合中对象的操作。

下载源码请到

MyGitHub

时间: 2024-10-29 12:19:37

Java设计模式--访问者模式的相关文章

深入浅出Java的访问者模式

一.引子 对于系统中一个已经完成的类层次结构,我们已经给它提供了满足需求的接口.但是面对新增加的需求,我们应该怎么做呢?如果这是为数不多的几次变动,而且你不用为了一个需求的调整而将整个类层次结构统统地修改一遍,那么直接在原有类层次结构上修改也许是个 不错 的主意. 但是往往我们遇到的却是:这样的需求变动也许会不停的发生:更重要的是需求的任何变动可能都要让你将整个类层次结构修改个底朝天--.这种类似的操作分布在不同的类里面,不是一个好现象,我们要对这个结构重构一下了. 那么,访问者模式也许是你很好

18、Python与设计模式--访问者模式

一.药房业务系统 假设一个药房,有一些大夫,一个药品划价员和一个药房管理员,它们通过一个药房管理系统组织工作流程.大夫开出药方后,药品划价员确定药品是否正常,价格是否正确:通过后药房管理员进行开药处理.该系统可以如何实现?最简单的想法,是分别用一个一个if-else-把划价员处理流程和药房管理流程实现,这样做的问题在于,扩展性不强,而且单一性不强,一旦有新药的加入或者划价流程.开药流程有些变动,会牵扯比较多的改动.今天介绍一种解决这类问题的模式:访问者模式.首先,构造药品类和工作人员类: cla

设计模式之禅之设计模式-访问者模式

一:访问者模式定义        --->封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. 二:访问者模式角色● Visitor--抽象访问者        抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象是可以被访问的.● ConcreteVisitor--具体访问者        它影响访问者访问到一个类后该怎么干,要做什么事情.● Element--抽象元素        接口或者抽象类,声

Java设计模式---Builder模式

之前想多写一些关于设计模式之类的东西,但是一直没写,主要是现在网上写这些的太多了,都懒的弄,反正我写这篇是写给自己做笔记的,我自己看,哼. 设计模式真的太重要了,不论是以后转学哪门语言,面向对象思想在这了,架构搭起来就会清晰些. 动手: 以前我们给model赋值的时候是这个样子的 Person person=new Person(); person.setAge(13); person.setId("33"); person.setName("薛之谦"); 这个是我

java设计模式-桥接模式(屌丝男学设计模式)

本文介绍设计模式中的桥接(Bridge)模式的概念,用法,以及实际应用中怎么样使用桥接模式进行开发. Bridge模式的概念 Bridge 模式是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展. Bridge模式的应用场景 面向对象的程序设计(OOP)里有类继承(子类继承父类)的

Java设计模式--备忘录模式

备忘录模式(别名:标记) 在不破坏封装性的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. Memento Pattern(Another Name: Token) Without violating encapsulation, capture and externalize an object original state so that the object can be restored to this state later. 类图

Java设计模式--模板方法模式

模板方法模式 定义一个操作中算法的骨架,而将一些步骤延迟到子类中.模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. Template Method Pattern Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorit

Java设计模式--外观模式

外观模式 为系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. Facade Pattern Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. 类图 模式的结构与使用 外观模式的结构中包两种角色.

Java设计模式--桥接模式

桥接模式(别名:柄体模式) 将抽象部分于它的实现部分分离,使它们都可以独立地变化. Bridge Pattern(Another Name:Handle-Body) Decouple an abstraction from its implementation so that the two can vary independently. 类图 模式的结构与使用 桥接模式的结构中包括四种角色. + 抽象(Abstraction):是一个抽象类,该抽象类含有Implementor声明的变量,即维护