ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

访问者设计模式

2020-07-11 17:37:04  阅读:222  来源: 互联网

标签:String 访问者 clazz Student new 设计模式 public name


个人认为访问者设计模式就是根据访问者的不同,展现事物不同的特性

public abstract class User {

    public String name;  //姓名
    public String identity; //身份
    public String clazz; //班级

    public User(String name , String identity , String clazz){
        this.name = name;
        this.identity = identity;
        this.clazz = clazz;
    }

    public abstract void accept(Visitor visitor);
}

 

public class Teacher  extends  User{

    public Teacher(String name , String identity , String clazz){
        super(name,identity,clazz);
    }
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    //升本率
    public double entranceRatio() {
        return BigDecimal.valueOf(Math.random() * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

}
public class Student extends User{

    public Student(String name , String identity , String clazz){
        super(name,identity,clazz);
    }

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

    public int ranking() {
        return (int) (Math.random() * 100);
    }
}

 

定义了一个抽象类User,Student 和 Teacher分别继承User 在accept方法中传入一个Visitor对象,根据Visitor对象的不同,观察Student和Teacher的角度也不同

 

public interface Visitor {

    //访问学生信息
    void visit(Student student);

    //访问老师信息
    void visit(Teacher teacher);
}

定义一个访问者接口Visitor

 

public class Parent implements Visitor{

    public void visit(Student student) {
        System.out.println("学生信息 姓名:"+student.name+" 班级: "+ student.clazz + " 排名: " + student.ranking());
    }

    public void visit(Teacher teacher) {
        System.out.println("老师信息 姓名:"+teacher.name+" 班级: "+teacher.clazz+" 级别: " + teacher.identity);
    }
}

 

public class Principal implements Visitor{

    public void visit(Student student) {
        System.out.println("学生信息 姓名:"+student.name+" 班级: "+student.clazz);
    }

    public void visit(Teacher teacher) {
        System.out.println("老师信息 姓名:"+teacher.name+" 班级: "+teacher.clazz+" 升学率: " + teacher.entranceRatio());
    }
}

分别定义校长和家长两个访问者,两个访问者访问Student和Teacher的角度不同,校长更关注老师的升学率 ,而家长更加关注孩子的排名和老师的级别

 

public class DataView {
    List<User> userList = new ArrayList<User>();

    public DataView() {
        userList.add(new Student("谢飞机", "重点班", "一年一班"));
        userList.add(new Student("windy", "重点班", "一年一班"));
        userList.add(new Student("大毛", "普通班", "二年三班"));
        userList.add(new Student("Shing", "普通班", "三年四班"));
        userList.add(new Teacher("BK", "特级教师", "一年一班"));
        userList.add(new Teacher("娜娜Goddess", "特级教师", "一年一班"));
        userList.add(new Teacher("dangdang", "普通教师", "二年三班"));
        userList.add(new Teacher("泽东", "实习教师", "三年四班"));
    }

    // 展示
    public void show(Visitor visitor) {
        for (User user : userList) {
            user.accept(visitor);
        }
    }

 

public class Test {

    public static void main(String[] args) {
        DataView dataView = new DataView();

        System.out.println("家长视角访问");
        dataView.show(new Parent());     // 家长

        System.out.println("校长视角访问");
        dataView.show(new Principal());  // 校长
    }

可以看出,在不同的访问者下,得到的内容是一样的.

标签:String,访问者,clazz,Student,new,设计模式,public,name
来源: https://www.cnblogs.com/lzh66/p/13284430.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有