访问者模式

访问者模式

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

一 、 概述

当一个集合中有若干个对象时,习惯上将这些对象称作集合中的元素,访问者模式可以使得我们在不改变集合中各个元素的类的前提下定义作用于这些元素上的新操作。

二、访问者模式的结构与使用

模式的结构中包括五种角色:

抽象元素( Element
具体元素( Concrete Element
对象结构( Object Structure
抽象访问者( Visitor
具体访问者( Concrete Visitor

模式的结构的描述与使用

1.抽象元素(Element: Student.java

public abstractclass Student{

     public abstract void accept(Visitor v);

}

2.具体元素(Concrete Element_1: Undergraduate.java

public  classUndergraduate extends Student{

      double math,english;    //成绩

      String name;

     Undergraduate(String name,doublemath,doubleenglish){

           this.name=name;

            this.math=math;

            this.english=english;

      }

      public double getMath(){

            returnmath;

      }

      public double getEnglish(){

            return english;

      }

      public String getName(){

            returnname;

      }

      public voidaccept(Visitor v){

           v.visit(this);

      }

}

2具体元素(Concrete Element_2:GraduateStudent.java

public  class GraduateStudent extends Student{

      double math,english,physics;    //成绩

      String name;

      GraduateStudent(String name,doublemath,doubleenglish,double physics){

           this.name=name;

            this.math=math;

            this.english=english;

            this.physics=physics;

      }

      public double getMath(){

            returnmath;

      }

      public double getEnglish(){

            return english;

      }

      public double getPhysics(){

            returnphysics;

      }

      public String getName(){

            returnname;

      }

      public voidaccept(Visitor v){

           v.visit(this);

      }

}

3.对象结构(Object Structure

本问题中,我们让该角色是 java.util 包中的 ArrayList 集合

4.抽象访问者(Visitor: Visitor.java

public interface Visitor{

   public void visit(Undergraduate stu);

   public void visit(GraduateStudentstu);

}

5.具体访问者( Concrete Visitor: Company.java

public class  Company implements Visitor{

    public void visit(Undergraduate stu){

          double math=stu.getMath();

          double english=stu.getEnglish();

          if(math>80&&english>90)

              System.out.println(stu.getName()+"被录用");

    }

    public void visit(GraduateStudentstu){

         double math=stu.getMath();

         double english=stu.getEnglish();

         double physics=stu.getPhysics();

         if(math>80&&english>90&&physics>70)

              System.out.println(stu.getName()+"被录用");

    }

}

6.应用: Application.java

import java.util.*;

public classApplication{

     public static void main(String args[]) {

           Visitor visitor=new Company();

           ArrayList<Student>  studentList=new  ArrayList<Student>();

           Student student=null;

           studentList.add(student=newUndergraduate("张三",67,88));

           studentList.add(student=newUndergraduate("李四",90,98));

           studentList.add(student=newUndergraduate("将粼粼",85,92));

           studentList.add(student=new GraduateStudent("刘名",88,70,87));

           studentList.add(student=new GraduateStudent("郝人",90,95,82));

           Iterator<Student> iter=studentList.iterator();

           while(iter.hasNext()){

                Student stu=iter.next();

                stu.accept(visitor); 

           }

     }

}

三、访问者模式的优点 

可以在不改变一个集合中的元素的类的情况下,增加新的施加于该元素上的新操作。
可以将集合中各个元素的某些操作集中到访问者中,不仅便于集合的维护,也有利于集合中元素的复用。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值