访问者模式 Visitor Pattern
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 适用环境
在以下情况下可以使用访问者模式:
- 一个对象包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作。不同类型的对象可以有不同的访问操作。
- 需要对一个对象结构中的对象进行很多不同并且不相关的操作,不希望增加新操作时修改这些类。
- 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
2. 访问者模式应用案例
案例说明:
小汽车由车架、轮胎、座椅等几部分构成,现在需要计算汽车的总重量、汽车的金属重量和汽车的材料所占的体积。汽车的组成部分可能增加,需要计算的内容也可能增加。
现使用访问者模式设计该系统,绘制类图并编码实现。
2.1 类图
2.2 代码实现
- Component类:汽车组件类,充当抽象元素类。该抽象类定义了抽象方法 accept(),可以接收一个 Visitor 实现类的实例,用于触发组件计算的动作。
public interface Component {
public void accept(CalculateContent content);
}
- 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);
}
}
- 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