当前位置:首页 > 科技  > 软件

访问者模式:对象结构的元素处理

来源: 责编: 时间:2023-10-27 17:22:23 413观看
导读什么是访问者模式?访问者模式是一种将数据结构与数据操作分离的设计模式。在访问者模式中,我们定义了一个访问者(Visitor)类,该类包含一组访问方法,每个方法用于处理不同类型的元素。然后,我们可以为不同类型的元素定义一个

什么是访问者模式?

访问者模式是一种将数据结构与数据操作分离的设计模式。在访问者模式中,我们定义了一个访问者(Visitor)类,该类包含一组访问方法,每个方法用于处理不同类型的元素。然后,我们可以为不同类型的元素定义一个元素类,并将这些元素传递给访问者进行处理。Agy28资讯网——每日最新资讯28at.com

访问者模式的核心思想是在不修改元素类的情况下,通过访问者来实现对元素的操作。这种模式通常用于处理复杂对象结构,其中包含多种类型的元素,以及需要执行不同操作的需求。Agy28资讯网——每日最新资讯28at.com

访问者模式的角色

访问者模式涉及以下几个角色:Agy28资讯网——每日最新资讯28at.com

  1. 访问者(Visitor):访问者是一个接口或抽象类,它定义了一组访问方法,每个方法用于处理不同类型的元素。
  2. 具体访问者(Concrete Visitor):具体访问者是实现访问者接口的具体类,它实现了访问方法,用于对元素进行具体的处理。
  3. 元素(Element):元素是一个接口或抽象类,它定义了一个接受(Accept)方法,该方法接受一个访问者作为参数,以便访问者可以对该元素进行操作。
  4. 具体元素(Concrete Element):具体元素是实现元素接口的具体类,它实现了接受方法,并将自身作为参数传递给访问者。
  5. 对象结构(Object Structure):对象结构是一个包含多种类型元素的集合,它通常提供了一种方式来遍历这些元素,以便访问者可以对它们进行操作。

为什么需要访问者模式?

访问者模式的主要目的是将数据结构与数据操作分离,使得可以在不修改元素类的情况下,通过访问者来添加新的操作。这种模式适用于以下情况:Agy28资讯网——每日最新资讯28at.com

  1. 元素类的稳定性高:如果元素类的稳定性很高,很少需要修改,但需要添加新的操作,那么使用访问者模式可以避免修改元素类。
  2. 多种操作与元素的组合:如果存在多种不同类型的操作需要与多种不同类型的元素组合,访问者模式可以简化操作的管理。
  3. 封装性要求高:访问者模式可以将具体的操作封装在具体访问者中,使得元素类保持封装性,不暴露细节。

访问者模式的实现

让我们通过一个简单的示例来演示访问者模式的实现。考虑一个电商平台,有不同类型的商品,包括书籍、电子产品和食品。我们希望实现一个价格计算器,该计算器可以根据商品的类型和折扣策略计算最终价格。Agy28资讯网——每日最新资讯28at.com

// 访问者接口interface Visitor {    void visit(Book book);    void visit(ElectronicProduct electronicProduct);    void visit(Food food);}// 具体访问者class PriceCalculator implements Visitor {    @Override    public void visit(Book book) {        double discount = book.getCategory().equals("Fiction") ? 0.2 : 0.1;        double discountedPrice = book.getPrice() * (1 - discount);        System.out.println("Price of " + book.getName() + ": $" + discountedPrice);    }    @Override    public void visit(ElectronicProduct electronicProduct) {        double discountedPrice = electronicProduct.getPrice() * 0.9;        System.out.println("Price of " + electronicProduct.getName() + ": $" + discountedPrice);    }    @Override    public void visit(Food food) {        double discountedPrice = food.getPrice() * 0.95;        System.out.println("Price of " + food.getName() + ": $" + discountedPrice);    }}// 元素接口interface Element {    void accept(Visitor visitor);}// 具体元素class Book implements Element {    private String name;    private String category;    private double price;    public Book(String name, String category, double price) {        this.name = name;        this.category = category;        this.price = price;    }    public String getName() {        return name;    }    public String getCategory() {        return category;    }    public double getPrice() {        return price;    }    @Override    public void accept(Visitor visitor) {        visitor.visit(this);    }}class ElectronicProduct implements Element {    private String name;    private double price;    public ElectronicProduct(String name, double price) {        this.name = name;        this.price = price;    }    public String getName() {        return name;    }    public double getPrice() {        return price;    }    @Override    public void accept(Visitor visitor) {        visitor.visit(this);    }}class Food implements Element {    private String name;    private double price;    public Food(String name, double price) {        this.name = name;        this.price = price;    }    public String getName() {        return name;    }    public double getPrice() {        return price;    }    @Override    public void accept(Visitor visitor) {        visitor.visit(this);    }}// 对象结构class ShoppingCart {    private List<Element> items = new ArrayList<>();    public void addItem(Element item) {        items.add(item);    }    public void accept(Visitor visitor) {        for (Element item : items) {            item.accept(visitor);        }    }}public class VisitorPatternExample {    public static void main(String[] args) {        ShoppingCart cart = new ShoppingCart();        cart.addItem(new Book("The Great Gatsby", "Fiction", 15.99));        cart.addItem(new ElectronicProduct("Smartphone", 499.99));        cart.addItem(new Food("Chocolate", 4.99));        Visitor priceCalculator = new PriceCalculator();        cart.accept(priceCalculator);    }}

在这个示例中,我们定义了访问者接口 Visitor,并实现了具体访问者 PriceCalculator。元素接口 Element 定义了 accept 方法,用于接受访问者。每个具体元素类都实现了 accept 方法,并将自身传递给访问者。Agy28资讯网——每日最新资讯28at.com

对象结构 ShoppingCart 包含了不同类型的商品元素,并提供了 accept 方法,用于遍历元素并调用访问者的方法。Agy28资讯网——每日最新资讯28at.com

在示例的 main 方法中,我们创建了一个购物车 cart,并向其中添加了书籍、电子产品和食品。然后,我们创建了一个 PriceCalculator 访问者,并将购物车传递给它进行价格计算。Agy28资讯网——每日最新资讯28at.com

访问者模式的优点

访问者模式的优点包括:Agy28资讯网——每日最新资讯28at.com

  • 符合开闭原则:可以通过添加新的访问者来扩展操作,而无需修改元素类。
  • 将操作与元素分离:访问者模式可以将数据结构与数据操作分离,使元素类保持简洁,不包含操作的逻辑。
  • 支持多态行为:访问者模式利用多态性,使不同类型的元素可以有不同的操作,增加了灵活性。

访问者模式的缺点

访问者模式的缺点包括:Agy28资讯网——每日最新资讯28at.com

  • 增加了类的数量:引入访问者模式会增加访问者和元素类的数量,增加了代码的复杂性。
  • 不容易理解:访问者模式的结构相对复杂,可能不容易理解和维护。

适用场景

访问者模式适用于以下情况:Agy28资讯网——每日最新资讯28at.com

  • 当需要对复杂对象结构中的元素进行不同类型的操作,而且这些操作需要保持独立时。
  • 当元素类的稳定性高,不经常修改,但需要添加新的操作时。
  • 当希望在不修改元素类的情况下,增加新的操作或访问方式时。

总结

访问者模式是一种行为型设计模式,它将数据结构与数据操作分离,通过访问者来实现对元素的操作。这种模式在处理复杂对象结构和需要多种操作的情况下非常有用。虽然它增加了类的数量和代码的复杂性,但能够提供灵活性和可扩展性,符合开闭原则。在实际项目中,可以根据具体需求考虑是否使用访问者模式。Agy28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15459-0.html访问者模式:对象结构的元素处理

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Linq 查询的结果会开辟新的内存吗?

下一篇: Rust 编译为 WebAssembly 在前端项目中的使用

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
Top