Java设计模式—访问者模式

本文详细介绍了访问者模式,包括模式概述、定义、适用环境,并通过汽车组件计算重量、金属重量和材料体积的案例展示了访问者模式的应用,强调了模式在扩展新操作时的优势以及可能带来的元素类扩展困难和封装性破坏的缺点。
摘要由CSDN通过智能技术生成

1. 访问者模式概述

  • 访问者模式是行为型模式,它包含访问者被访问元素两个主要组成部分。
  • 被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。
  • 访问者模式使得用户可以在不修改现有系统的情况下扩展系统的功能,为这些不同类型的元素增加新的元素。

1.1 定义

访问者模式让用户可以在不改变各元素类的前提下定义作用于这些元素的新操作。

Visitor Pattern: Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

1.2 结构

访问者模式结构

1.3 适用环境

在以下情况下可以使用访问者模式:

  1. 一个对象包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作。不同类型的对象可以有不同的访问操作。
  2. 需要对一个对象结构中的对象进行很多不同并且不相关的操作,不希望增加新操作时修改这些类。
  3. 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。

2. 访问者模式应用案例

案例说明:
小汽车由车架、轮胎、座椅等几部分构成,现在需要计算汽车的总重量、汽车的金属重量和汽车的材料所占的体积。汽车的组成部分可能增加,需要计算的内容也可能增加。
现使用访问者模式设计该系统,绘制类图并编码实现。

2.1 类图

类图

2.2 代码实现

  1. Component类:汽车组件类,充当抽象元素类。该抽象类定义了抽象方法 accept(),可以接收一个 Visitor 实现类的实例,用于触发组件计算的动作。
public interface Component {
   
	public void accept(CalculateContent content);
}
  1. Car类:具体汽车元素类。
public class Car implements Component {
   
	
	private String name;	//名称
	private double quality;	//质量
	private double density;	//密度
	
	public Car(String name, double quality, double density) {
   
		this.name = name;
		this.quality = quality;
		this.density = density;
	}

	public String getName() {
   
		return name;
	}

	public void setName(String name) {
   
		this.name = name;
	}

	public double getQuality() {
   
		return quality;
	}

	public void setQuality(double quality) {
   
		this.quality = quality;
	}

	public double getDensity() {
   
		return density;
	}

	public void setDensity(double density) {
   
		this.density = density;
	}

	@Override
	public void accept(CalculateContent content) {
   
		content.calculate(this);
	}
}
  1. Carframe类:具体车架元素类。
public class Carframe implements Component {
   

	private String name;	//名称
	private double quality;	//质量
	private double density;	//密度
	
	public Carframe(String name, double quality, double density) {
   
		this.name = name;
		this.quality = quality;
		this.density = density;
	}
	
	public String getName() {
   
		return name;
	}

	public void setName(String name) {
   
		this
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值