深入理解访问者模式,应用场景,java demo演示
时间: 2023-10-17 17:17:40 浏览: 100
访问者模式是一种行为型设计模式,用于处理复杂对象结构中的元素,同时保持类型安全性。它将算法与对象结构分离,使得算法可以独立于对象结构而变化。
应用场景:
1. 需要对一个复杂对象结构中的元素进行复杂的操作,并且这些操作需要访问对象的内部状态。
2. 对象结构中的元素类经常发生变化,而需要在不影响其他类的情况下增加或修改操作。
3. 对象结构中的元素类之间的耦合度很高,而且不希望在它们之间增加任何依赖关系。
Java Demo演示:
我们以一个简单的电商系统为例,演示访问者模式的应用。假设该系统有以下几类商品:
1. 书籍(Book)
2. 食品(Food)
3. 数码产品(DigitalProduct)
4. 家具(Furniture)
现在需要统计不同种类商品的总价值。定义一个Visitor接口,声明了对不同商品类的visit方法。
```java
public interface Visitor {
void visit(Book book);
void visit(Food food);
void visit(DigitalProduct digitalProduct);
void visit(Furniture furniture);
}
```
定义一个抽象商品类Product,包含accept方法接受Visitor对象的访问。
```java
public abstract class Product {
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public abstract void accept(Visitor visitor);
}
```
具体商品类继承自Product,实现accept方法。
```java
public class Book extends Product {
public Book(String name, double price) {
super(name, price);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class Food extends Product {
public Food(String name, double price) {
super(name, price);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class DigitalProduct extends Product {
public DigitalProduct(String name, double price) {
super(name, price);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class Furniture extends Product {
public Furniture(String name, double price) {
super(name, price);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
```
实现Visitor接口的具体类,用于统计不同种类商品的总价值。
```java
public class PriceVisitor implements Visitor {
private double bookPrice;
private double foodPrice;
private double digitalPrice;
private double furniturePrice;
@Override
public void visit(Book book) {
bookPrice += book.getPrice();
}
@Override
public void visit(Food food) {
foodPrice += food.getPrice();
}
@Override
public void visit(DigitalProduct digitalProduct) {
digitalPrice += digitalProduct.getPrice();
}
@Override
public void visit(Furniture furniture) {
furniturePrice += furniture.getPrice();
}
public double getBookPrice() {
return bookPrice;
}
public double getFoodPrice() {
return foodPrice;
}
public double getDigitalPrice() {
return digitalPrice;
}
public double getFurniturePrice() {
return furniturePrice;
}
}
```
客户端代码如下:
```java
public class Client {
public static void main(String[] args) {
List<Product> productList = new ArrayList<>();
productList.add(new Book("Java编程思想", 99.9));
productList.add(new Food("牛肉干", 20.0));
productList.add(new DigitalProduct("iPhone", 5000.0));
productList.add(new Furniture("床", 2000.0));
PriceVisitor priceVisitor = new PriceVisitor();
for (Product product : productList) {
product.accept(priceVisitor);
}
System.out.println("书籍总价值:" + priceVisitor.getBookPrice());
System.out.println("食品总价值:" + priceVisitor.getFoodPrice());
System.out.println("数码产品总价值:" + priceVisitor.getDigitalPrice());
System.out.println("家具总价值:" + priceVisitor.getFurniturePrice());
}
}
```
运行结果如下:
```
书籍总价值:99.9
食品总价值:20.0
数码产品总价值:5000.0
家具总价值:2000.0
```
以上就是访问者模式的一个简单应用,通过统一的Visitor接口和accept方法,实现了不同商品类的访问和操作,从而避免了代码的冗余和重复。
阅读全文