设计模式之访问者模式(上)

这篇具有很好参考价值的文章主要介绍了设计模式之访问者模式(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

访问者模式
1)概述
1.概念

访问者模式包含访问者被访问元素两个主要组成部分。

处方单中的各种药品信息就是被访问的元素,而划价人员和药房工作人员就是访问者,被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。

被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为对象结构,访问者通过遍历对象结构实现对其中存储的元素的逐个操作。

2.定义

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

3.结构图

设计模式之访问者模式(上),设计模式,设计模式,访问者模式

4.角色

Vistor(抽象访问者):抽象访问者为对象结构中每一个具体元素类ConcreteElement声明一个访问操作,从这个操作的名称或参数类型可以清楚知道需要访问的具体元素的类型,具体访问者需要实现这些操作方法,定义对这些元素的访问操作。

ConcreteVisitor(具体访问者):具体访问者实现了每个由抽象访问者声明的操作,每一个操作用于访问对象结构中一种类型的元素。

Element(抽象元素):抽象元素一般是抽象类或者接口,它定义一个accept()方法,该方法通常以一个抽象访问者作为参数。

ConcreteElement(具体元素):具体元素实现了accept()方法,在accept()方法中调用访问者的访问方法以便完成对一个元素的操作。

ObjectStructure(对象结构):对象结构是一个元素的集合,它用于存放元素对象,并且提供了遍历其内部元素的方法,可以结合组合模式来实现,也可以是一个简单的集合对象,如一个List对象或一个Set对象。

5.代码实现

抽象访问者类

abstract class Visitor{
	public abstract void visit(ConcreteElementA elementA);
	public abstract void visit(ConcreteElementB elementB);
	public void visit(ConcreteElementC elementC){
		//元素ConcreteElementC操作代码
	}
}

具体访问者类

class ConcreteVisitor extends Visitor{
	public void visit(ConcreteElementA elementA){
		//元素ConcreteElementA操作代码
	}
	
	public void visit(ConcreteElementB elementB){
		//元素ConcreteElementB操作代码
	}
}

抽象元素类

interface Element{
	public void accept(Visitor visitor);
}

具体元素类

class ConcreteElementA implements Element{
	public void accept(Visitor visitor){
		visitor.visit(this);
	}
	
	public void operationA(){
		//业务方法
	}
}

对象结构类

class ObjectStructure{
  //定义一个集合用于存储元素对象
	private ArrayList<Element> list = new ArrayList<Element>(); 
 
	public void accept(Visitor visitor){
		Iterator i=list.iterator();
		
		while(i.hasNext()){
		  //遍历访问集合中的每一个元素
			((Element)i.next()).accept(visitor); 
		}
	}
 
	public void addElement(Element element){
		list.add(element);
	}
 
	public void removeElement(Element element){
		list.remove(element);
	}
}
2)完整解决方案
1.结构图

设计模式之访问者模式(上),设计模式,设计模式,访问者模式

FADepartment表示财务部,HRDepartment表示人力资源部,充当具体访问者角色,其抽象父类Department充当抽象访问者角色;EmployeeList充当对象结构,用于存储员工列表;FulltimeEmployee表示正式员工,ParttimeEmployee表示临时工,充当具体元素角色,其父接口Employee充当抽象元素角色。

2.代码实现
import java.util.*;
 
//员工类:抽象元素类
interface Employee{
	public void accept(Department handler); //接受一个抽象访问者访问
}
 
//全职员工类:具体元素类
@Data
class FulltimeEmployee implements Employee{
	private String name;
	private double weeklyWage;
	private int workTime;
 
	public FulltimeEmployee(String name,double weeklyWage,int workTime)
	{
		this.name = name;
		this.weeklyWage = weeklyWage;
		this.workTime = workTime;
	}	
 
	public void accept(Department handler){
		handler.visit(this); //调用访问者的访问方法
	}
}
 
//兼职员工类:具体元素类
@Data
class ParttimeEmployee implements Employee
{
	private String name;
	private double hourWage;
	private int workTime;
 
	public ParttimeEmployee(String name,double hourWage,int workTime)
	{
		this.name = name;
		this.hourWage = hourWage;
		this.workTime = workTime;
	}	
 
	public void accept(Department handler){
		handler.visit(this); //调用访问者的访问方法
	}
}
 
//部门类:抽象访问者类
abstract class Department{
  //声明一组重载的访问方法,用于访问不同类型的具体元素
	public abstract void visit(FulltimeEmployee employee);
	public abstract void visit(ParttimeEmployee employee);	
}
 
//财务部类:具体访问者类
class FADepartment extends Department{
  //实现财务部对全职员工的访问
	public void visit(FulltimeEmployee employee){
		int workTime = employee.getWorkTime();
		double weekWage = employee.getWeeklyWage();
		if(workTime > 40){
			weekWage = weekWage + (workTime - 40) * 100;
		}else if(workTime < 40){
			weekWage = weekWage - (40 - workTime) * 80;
			if(weekWage < 0){
				weekWage = 0;
			}
		}
		System.out.println("正式员工" + employee.getName() + "实际工资为:" + weekWage + "元。");			
	}
 
  //实现财务部对兼职员工的访问
	public void visit(ParttimeEmployee employee){
		int workTime = employee.getWorkTime();
		double hourWage = employee.getHourWage();
		System.out.println("临时工" + employee.getName() + "实际工资为:" + workTime * hourWage + "元。");		
	}		
}
 
//人力资源部类:具体访问者类
class HRDepartment extends Department{
  //实现人力资源部对全职员工的访问
	public void visit(FulltimeEmployee employee){
		int workTime = employee.getWorkTime();
		System.out.println("正式员工" + employee.getName() + "实际工作时间为:" + workTime + "小时。");
		if(workTime > 40){
			System.out.println("正式员工" + employee.getName() + "加班时间为:" + (workTime - 40) + "小时。");
		}else if(workTime < 40){
			System.out.println("正式员工" + employee.getName() + "请假时间为:" + (40 - workTime) + "小时。");
		}						
	}
 
  //实现人力资源部对兼职员工的访问
	public void visit(ParttimeEmployee employee){
		int workTime = employee.getWorkTime();
		System.out.println("临时工" + employee.getName() + "实际工作时间为:" + workTime + "小时。");
	}		
}
 
//员工列表类:对象结构
class EmployeeList
{
  //定义一个集合用于存储员工对象
	private ArrayList<Employee> list = new ArrayList<Employee>();
 
	public void addEmployee(Employee employee){
		list.add(employee);
	}
 
  //遍历访问员工集合中的每一个员工对象
	public void accept(Department handler){
		for(Object obj : list){
			((Employee)obj).accept(handler);
		}
	}
}

客户端类文章来源地址https://www.toymoban.com/news/detail-858152.html

public class Client{
	public static void main(String args[]){
		EmployeeList list = new EmployeeList();
		Employee fte1,fte2,fte3,pte1,pte2;
 
		fte1 = new FulltimeEmployee("张无忌",3200.00,45);
		fte2 = new FulltimeEmployee("杨过",2000.00,40);
		fte3 = new FulltimeEmployee("段誉",2400.00,38);
		pte1 = new ParttimeEmployee("洪七公",80.00,20);
		pte2 = new ParttimeEmployee("郭靖",60.00,18);
 
		list.addEmployee(fte1);
		list.addEmployee(fte2);
		list.addEmployee(fte3);
		list.addEmployee(pte1);
		list.addEmployee(pte2);
 
		Department dep;
		dep = new HRDepartment();
		list.accept(dep);
	}
}

到了这里,关于设计模式之访问者模式(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • js设计模式:访问者模式

    js设计模式:访问者模式

    将操作方法封装在一个访问者对象中,而不是封装在每个被访问对象当中。 访问者对象可以通过调用被访问者的接口,用来操作被访问者。

    2024年02月22日
    浏览(25)
  • Java设计模式-访问者模式

    在软件开发领域中,设计模式是解决常见问题的经典方法。其中,访问者模式是一种强大且灵活的设计模式,用于处理对象结构中的元素,并根据不同的访问者实现不同的操作。 访问者模式是一种行为型设计模式,它允许你在不改变元素类的前提下定义新的操作。该模式将算

    2024年02月06日
    浏览(7)
  • 设计模式之访问者模式(上)

    设计模式之访问者模式(上)

    访问者模式 1)概述 1.概念 访问者模式包含 访问者 和 被访问元素 两个主要组成部分。 处方单中的各种药品信息就是 被访问的元素 ,而划价人员和药房工作人员就是 访问者 ,被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。 被访问元素

    2024年04月25日
    浏览(15)
  • 03-JAVA设计模式-访问者模式

    03-JAVA设计模式-访问者模式

    访问者模式(Visitor Pattern)是软件设计模式中的一种行为模式,它用于将数据结构中的元素与操作这些元素的操作解耦。这种模式使得可以在不修改数据结构的情况下添加新的操作。 在访问者模式中,我们定义了两个主要角色: 访问者(Visitor): 这个接口声明了一个访问元

    2024年04月29日
    浏览(22)
  • 设计模式:访问者模式(C++实现)

    访问者模式通过将对元素的操作与元素本身分离,使得可以在不修改元素类的情况下定义新的操作。 运行结果: 在上述代码中,Visitor是访问者接口,定义了访问具体元素的方法。Element是元素接口,定义了接受访问者访问的方法。ConcreteElementA和ConcreteElementB是具体元素类,实

    2024年02月07日
    浏览(16)
  • 设计模式(二十三)访问者

    设计模式(二十三)访问者

    表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式 访问者模式是一种较为复杂的行为型模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素

    2024年02月19日
    浏览(12)
  • 【设计模式与范式:行为型】69 | 访问者模式(下):为什么支持双分派的语言不需要访问者模式?

    上一节课中,我们学习了访问者模式的原理和实现,并且还原了访问者模式诞生的思维过程。总体上来讲,这个模式的代码实现比较难,所以应用场景并不多。从应用开发的角度来说,它的确不是我们学习的重点。 不过,我们前面反复说过,学习我的专栏,并不只是让你掌握

    2024年02月10日
    浏览(13)
  • 笨蛋学设计模式行为型模式-访问者模式【21】

    8.8.1概念 ​ 访问者模式是一种将操作逻辑与对象结构分离的方法,使得操作可以独立变化,操作逻辑被封装在独立的访问者类中,并在被访问的元素类中提供接受访问者的方法,而不是直接嵌入到数据结构中的对象中。 8.8.2场景 ​ 我们可以将一个购物商场中的商品类作为元

    2024年01月23日
    浏览(11)
  • 瑞_23种设计模式_访问者模式

    瑞_23种设计模式_访问者模式

    🙊 前言:本文章为瑞_系列专栏之《23种设计模式》的访问者模式篇。本文中的部分图和概念等资料,来源于博主学习设计模式的相关网站《菜鸟教程 | 设计模式》和《黑马程序员Java设计模式详解》,特此注明。本文中涉及到的软件设计模式的概念、背景、优点、分类、以及

    2024年04月15日
    浏览(10)
  • 【设计模式】字节三面:请举例阐释访问者模式

    【设计模式】字节三面:请举例阐释访问者模式

    今天我们要一起探讨的主题是一种设计模式——访问者模式(Visitor Pattern)。我将从最基础的概念、应用场景,再到实例代码的展示,全方位的为大家剖析访问者模式。而且,我保证,你即使是编程新手, 也能理解并开始应用这个设计模式! 首先,让我们先看一眼访问者模式的

    2024年01月23日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包