首页 > 其他分享 >设计模式-访问者模式(主要理解“双重分派”)

设计模式-访问者模式(主要理解“双重分派”)

时间:2023-12-10 21:34:20浏览次数:33  
标签:void visit 分派 访问 设计模式 PartTimeEmployee public 访问者

代码展示:

package com.example.test;

import java.util.ArrayList;
import java.util.List;

public class 访问者模式 {
}


abstract class Department{
    abstract void visit(FullTimeEmployee fullTimeEmployee);//正式工的访问
    abstract void visit(PartTimeEmployee PartTimeEmployee);//临时工的访问
}

class FADepartment extends Department{//财务部

    @Override
    void visit(FullTimeEmployee fullTimeEmployee) {
        //财务部实现对正式工的访问
        System.out.println("财务部对 正式工 " + fullTimeEmployee.name +"进行了访问,已根据工作情况计算了薪水");

    }

    @Override
    void visit(PartTimeEmployee PartTimeEmployee) {
        //财务部实现对小时工的访问
        System.out.println("财务部对 小时工 " + PartTimeEmployee.name +"进行了访问,已根据工作情况计算了薪水");
    }
}
class HRDepartment extends Department{//人力资源部

    @Override
    void visit(FullTimeEmployee fullTimeEmployee) {
        //人力资源部实现对正式工的访问
        System.out.println("人力资源部对 正式工 " + fullTimeEmployee.name +"进行了访问,已汇总考勤情况");
    }

    @Override
    void visit(PartTimeEmployee PartTimeEmployee) {
        //人力资源部实现对小时工的访问
        System.out.println("人力资源部对 小时工 " + PartTimeEmployee.name +"进行了访问,已汇总考勤情况");
    }
}

interface Employee{//职员
    void accept(Department department);
}

class FullTimeEmployee implements Employee{//正式工
    public String name;//姓名
    public double weeklyWage;//周薪
    public int workTime;//工时

    public void accept(Department department) {
        department.visit(this);
    }
}

class PartTimeEmployee implements Employee{//临时工
    public String name;//姓名
    public double hourWage;//时薪
    public int workTime;//工时

    public void accept(Department department) {
        department.visit(this);
    }
}

class EmployeeList{
    private static final List<Employee> LIST = new ArrayList<>();

    public void accept(Department department){
        LIST.forEach(employee -> employee.accept(department));
    }
}

访问者模式总结:

1.主要关注双重分派的含义,其实就是两次调用,

第一次是调用了元素的accept方法

在元素的accept方法内进行了第二次调用,调用了访问者的visit方法

最终在访问者的visit方法中完成了对元素的访问

2.可以很方便的增加一个访问者,但是增加一个元素就很麻烦。因为抽象访问者要增加新元素的访问方法,所有具体访问者都要重写新的访问方法,改动量很大

所以对于访问者的改动是满足开闭原则的,但是针对元素就不满足开闭原则。此模式对于开闭原则具有倾斜性

优缺点总结:TODO

适用场景:TODO

标签:void,visit,分派,访问,设计模式,PartTimeEmployee,public,访问者
From: https://www.cnblogs.com/randy123/p/17893257.html

相关文章

  • 23种设计模式——桥接模式
    今天我们继续学习23种设计模式中的桥接模式。所谓桥接模式就是将抽象部分和实现部分隔离开来,使得它们能够独立变化。桥接模式将继承关系转化成关联关系,封装了变化,完成了解耦,减少了系统中类的数量,也减少了代码量。概念:桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化。......
  • 设备驱动设计模式 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/design-patterns.html设备驱动设计模式这份文档描述了设备驱动中常见的设计模式。子系统维护者可能会要求驱动开发者遵循这些设计模式。状态容器container_of()1.状态容器虽然内核中包含一些设备驱动,假......
  • 小谈设计模式(16)—抽象工厂模式
    (小谈设计模式(16)—抽象工厂模式)专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。抽象工厂模式抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供了......
  • 23种设计模式——适配器模式
    今天开始我们就要进入到结构型的设计模式学习之中了,今天讲的设计模式是23种设计模式的第六种——适配器模式。通俗的讲,适配器的作用就是将两个互不兼容的东西进行一个适配的操作,它作为中间的桥梁。下面我们进入适配器模式的学习。应用前景:在现实生活中,适配器这样的例子随处可......
  • Java-Spring框架中用到的设计模式
    Java-Spring框架中用到的设计模式单例模式(Singleton)Spring中的Bean默认是单例的,容器中只存在一个实例。这有助于节省资源,提高性能。工厂模式(Factory)Spring使用工厂模式来创建和管理Bean。通过配置文件或注解,Spring容器可以根据需要创建相应的Bean对象。代理模......
  • 单例设计模式
    单例模式是一种常用的软件设计模式,其目标是确保一个类只有一个实例,并提供一个全局访问点。在C++中,可以通过以下步骤实现单例模式:私有化构造函数,以防止外界创建单例类的对象。使用类的私有静态指针变量指向类的唯一实例。使用一个公有的静态方法获取该实例。以下是一个简......
  • 小谈设计模式(14)—建造者模式
    (小谈设计模式(14)—建造者模式)专栏介绍专栏地址link专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。建造者模式建造者模式是一种创建型设计模式,它可以将一个复杂......
  • GOF23--23种设计模式(二)
    一.建造者模式建造者模式也是属于建造型模式,它提供了一种创建对象的最佳方式定义:将一个复杂的对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示主要作用:在用户不知道对象的构建细节的情况下,就可以创建复杂的对象这里需要注意一下,建造者模式都都是用来创建复杂对......
  • 23种设计模式——建造者模式
    今天我们要学习的是23种设计模式中的第四种——建造者模式。建造者模式主要适用于一些基本部件不会变,而其组合经常变化的情况,下面我们开始进入正题。概念:建造者模式(BuilderPattern)又叫生成器模式,是一种对象构建模式。建造者模式是将一个复杂对象的构造与它的表示分离,使同样的......
  • uml设计模式语言
    UML(UnifiedModelingLanguage)是一种广泛应用于软件开发和系统设计的建模语言。在软件工程中,UML图用于可视化、规划和共享系统设计的概念,其中类图是其中最核心、最常用的一种图示。本文将简述UML模型设计的基本概念,重点关注类图及其关系的详细解释。1.UML概述:UML作为一种标准化......