首页 > 其他分享 >访问者模式

访问者模式

时间:2023-11-13 17:44:22浏览次数:21  
标签:Visitor void visit 模式 student visitor public 访问者

访问者模式

1.说明

同一个事物的不同视角下访问信息的不同

家长视角下的老师-》教学质量怎么样
家长视角下的学生-》分数好不好

校长视角下的老师-》老没有被投诉
校长视角下的学生-》是不是三好学生

2.抽象代码结构

2.1 抽象角色,老师,学生

User.java

@NoArgsConstructor
@AllArgsConstructor
@Data
public abstract class User {
    protected String name; // 姓名
    protected String identity; // 身份
    protected String clazz; // 班级

    public abstract void accept(Visitor visitor);
}

Student.java

@Data
@NoArgsConstructor
public class Student extends User{
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

Teacher.java

@NoArgsConstructor
@Data
public class Teacher extends User{
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

2.2 角色的说明

identity:老师角色是普通教师,特级教师;学生是重点班还是普通班
clazz:班级
核心是accept的抽象方法里参数是视角Visitor对象。并且角色实现方法里,把自身传递进去

2.3 视角的定义

Visitor.java

public interface Visitor {
    void visit(Student student);

    void visit(Teacher teacher);
}

定义了重载方法,入参类型不一致。这个是关键

家长视图ParentVisitor.java

@Slf4j
public class ParentVisitor implements Visitor{

    public void visit(Student student) {
        log.info("student visit ...");
    }

    @Override
    public void visit(Teacher teacher) {
        log.info("teacher visit ...");
    }
}

3.测试类说明

ViewMain.java

public class ViewMain {
    public static void main(String[] args) {
        Visitor visitor = new ParentVisitor(); // 定义家长视角
        Student student = new Student();
        student.setName("hby");
        student.setClazz("三年二班");
        student.setIdentity("重点班");
        student.accept(visitor); // 学生调用accept把视角传递进去
    }
}

4.优缺点

优点:工程结构更容易添加和修改。做到了系统服务的解耦,代码更清晰

缺点:抽象类的抽象方法时候还需要接受访问者接口的参数传递。该设计会让代码变得组织难度加大。违背了米特原则。最少知道原则。
一定要符合场景的运用,以及提取这部分设计思想的精髓才是重中之重。

标签:Visitor,void,visit,模式,student,visitor,public,访问者
From: https://www.cnblogs.com/PythonOrg/p/17829729.html

相关文章

  • C语言——共用体union存储结构与大小端存储模式
    1、大小端存储模式大端:低位数据字节存储在高地址小端:低位数据字节存储在低地址注释:例如int的权重低的8bit,低位指的是00000001000000000000000000000000000000012、共用体union存储结构共用体内每段数据元素从低地址开始存储。注释:数组的每个元素的地址随着索引的增大......
  • Spring5学习随笔-Spring5的基本介绍、工厂设计模式
    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】第一章、引言![](https://img2023.cnblogs.com/blog/3321544/202311/3321544-20231113123010602-1325702857.png)SpringIOC工厂是Spring框架中的......
  • Java的设计模式之原型模式
    在某些情况下,需要创建对象的副本,但是复制一个对象的成本可能很高,或者希望避免与对象的具体类耦合。例如,当创建对象的过程较为复杂,或者对象包含大量共享的状态时,使用常规的创建方法可能会导致性能下降。原型模式的解决方案是通过复制现有对象来创建新对象,而不是从头开始构建。这允许......
  • 生成器模式
    [实验任务一]:计算机组装使用建造者模式,完成下述任务:计算机组装工厂可以将CPU、内存、硬盘、主机等硬件设备组装在一起构成计算机,计算机的类型可以是笔记本,也可以是台式机。packageTutorial_5;publicclassClient{publicstaticvoidmain(String[]args){......
  • 单例模式
    [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。 packageTutorial_7;/***@authormendianyu*/publicclassStuID{//单例模式中的实例privatestaticStuIDinstance=null;//学号privateStringid;......
  • 抽象工厂模式
    [实验任务]:人与肤色使用抽象工厂模式,完成下述产品等级结构: 类图 publicclassBlackFactoryimplementsPeopleFactory{@OverridepublicManproduceMan(){returnnewBlackMan();}@OverridepublicWomanproduceWoman()......
  • 实验12:外观模式
    [实验任务一]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(HardDisk)的读取(read())、操作系统(OS)的载入(load()),如果某一过程发生错误则计算机启动失败。......
  • 实验13:享元模式
    [实验任务一]:围棋设计一个围棋软件,在系统中只存在一个白棋对象和一个黑棋对象,但是它们可以在棋盘的不同位置显示多次。  packagerjsj.no13;/** *客户端测试类 * */publicclassClient{   publicstaticvoidmain(String[]args){       IgoCh......
  • 软件设计实验10:组合模式
    实验10:组合模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解组合模式的动机,掌握该模式的结构;2、能够利用组合模式解决实际问题。 [实验任务一]:组合模式用透明组合模式实现教材中的“文件夹浏览”这个例子。实验要求:1. 文件的执行不需真正实现,只需简单......
  • 软件设计实验11:装饰模式
    实验11:装饰模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解装饰模式的动机,掌握该模式的结构;2、能够利用装饰模式解决实际问题。 [实验任务一]:手机功能的升级用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而......