日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

訪問者模式:對象結(jié)構(gòu)的元素處理

來源: 責編: 時間:2023-10-27 17:22:23 355觀看
導讀什么是訪問者模式?訪問者模式是一種將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離的設計模式。在訪問者模式中,我們定義了一個訪問者(Visitor)類,該類包含一組訪問方法,每個方法用于處理不同類型的元素。然后,我們可以為不同類型的元素定義一個

什么是訪問者模式?

訪問者模式是一種將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離的設計模式。在訪問者模式中,我們定義了一個訪問者(Visitor)類,該類包含一組訪問方法,每個方法用于處理不同類型的元素。然后,我們可以為不同類型的元素定義一個元素類,并將這些元素傳遞給訪問者進行處理。jpS28資訊網(wǎng)——每日最新資訊28at.com

訪問者模式的核心思想是在不修改元素類的情況下,通過訪問者來實現(xiàn)對元素的操作。這種模式通常用于處理復雜對象結(jié)構(gòu),其中包含多種類型的元素,以及需要執(zhí)行不同操作的需求。jpS28資訊網(wǎng)——每日最新資訊28at.com

訪問者模式的角色

訪問者模式涉及以下幾個角色:jpS28資訊網(wǎng)——每日最新資訊28at.com

  1. 訪問者(Visitor):訪問者是一個接口或抽象類,它定義了一組訪問方法,每個方法用于處理不同類型的元素。
  2. 具體訪問者(Concrete Visitor):具體訪問者是實現(xiàn)訪問者接口的具體類,它實現(xiàn)了訪問方法,用于對元素進行具體的處理。
  3. 元素(Element):元素是一個接口或抽象類,它定義了一個接受(Accept)方法,該方法接受一個訪問者作為參數(shù),以便訪問者可以對該元素進行操作。
  4. 具體元素(Concrete Element):具體元素是實現(xiàn)元素接口的具體類,它實現(xiàn)了接受方法,并將自身作為參數(shù)傳遞給訪問者。
  5. 對象結(jié)構(gòu)(Object Structure):對象結(jié)構(gòu)是一個包含多種類型元素的集合,它通常提供了一種方式來遍歷這些元素,以便訪問者可以對它們進行操作。

為什么需要訪問者模式?

訪問者模式的主要目的是將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離,使得可以在不修改元素類的情況下,通過訪問者來添加新的操作。這種模式適用于以下情況:jpS28資訊網(wǎng)——每日最新資訊28at.com

  1. 元素類的穩(wěn)定性高:如果元素類的穩(wěn)定性很高,很少需要修改,但需要添加新的操作,那么使用訪問者模式可以避免修改元素類。
  2. 多種操作與元素的組合:如果存在多種不同類型的操作需要與多種不同類型的元素組合,訪問者模式可以簡化操作的管理。
  3. 封裝性要求高:訪問者模式可以將具體的操作封裝在具體訪問者中,使得元素類保持封裝性,不暴露細節(jié)。

訪問者模式的實現(xiàn)

讓我們通過一個簡單的示例來演示訪問者模式的實現(xiàn)。考慮一個電商平臺,有不同類型的商品,包括書籍、電子產(chǎn)品和食品。我們希望實現(xiàn)一個價格計算器,該計算器可以根據(jù)商品的類型和折扣策略計算最終價格。jpS28資訊網(wǎng)——每日最新資訊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);    }}// 對象結(jié)構(gòu)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,并實現(xiàn)了具體訪問者 PriceCalculator。元素接口 Element 定義了 accept 方法,用于接受訪問者。每個具體元素類都實現(xiàn)了 accept 方法,并將自身傳遞給訪問者。jpS28資訊網(wǎng)——每日最新資訊28at.com

對象結(jié)構(gòu) ShoppingCart 包含了不同類型的商品元素,并提供了 accept 方法,用于遍歷元素并調(diào)用訪問者的方法。jpS28資訊網(wǎng)——每日最新資訊28at.com

在示例的 main 方法中,我們創(chuàng)建了一個購物車 cart,并向其中添加了書籍、電子產(chǎn)品和食品。然后,我們創(chuàng)建了一個 PriceCalculator 訪問者,并將購物車傳遞給它進行價格計算。jpS28資訊網(wǎng)——每日最新資訊28at.com

訪問者模式的優(yōu)點

訪問者模式的優(yōu)點包括:jpS28資訊網(wǎng)——每日最新資訊28at.com

  • 符合開閉原則:可以通過添加新的訪問者來擴展操作,而無需修改元素類。
  • 將操作與元素分離:訪問者模式可以將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離,使元素類保持簡潔,不包含操作的邏輯。
  • 支持多態(tài)行為:訪問者模式利用多態(tài)性,使不同類型的元素可以有不同的操作,增加了靈活性。

訪問者模式的缺點

訪問者模式的缺點包括:jpS28資訊網(wǎng)——每日最新資訊28at.com

  • 增加了類的數(shù)量:引入訪問者模式會增加訪問者和元素類的數(shù)量,增加了代碼的復雜性。
  • 不容易理解:訪問者模式的結(jié)構(gòu)相對復雜,可能不容易理解和維護。

適用場景

訪問者模式適用于以下情況:jpS28資訊網(wǎng)——每日最新資訊28at.com

  • 當需要對復雜對象結(jié)構(gòu)中的元素進行不同類型的操作,而且這些操作需要保持獨立時。
  • 當元素類的穩(wěn)定性高,不經(jīng)常修改,但需要添加新的操作時。
  • 當希望在不修改元素類的情況下,增加新的操作或訪問方式時。

總結(jié)

訪問者模式是一種行為型設計模式,它將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離,通過訪問者來實現(xiàn)對元素的操作。這種模式在處理復雜對象結(jié)構(gòu)和需要多種操作的情況下非常有用。雖然它增加了類的數(shù)量和代碼的復雜性,但能夠提供靈活性和可擴展性,符合開閉原則。在實際項目中,可以根據(jù)具體需求考慮是否使用訪問者模式。jpS28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-15459-0.html訪問者模式:對象結(jié)構(gòu)的元素處理

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Linq 查詢的結(jié)果會開辟新的內(nèi)存嗎?

下一篇: Rust 編譯為 WebAssembly 在前端項目中的使用

標簽:
  • 熱門焦點
  • 紅魔電競平板評測:大屏幕硬實力

    前言:三年的疫情因為要上網(wǎng)課的原因激活了平板市場,如今網(wǎng)課的時代已經(jīng)過去,大家的生活都恢復到了正軌,這也就意味著,真正考驗平板電腦生存的環(huán)境來了。也就是面對著這種殘酷的
  • K8S | Service服務發(fā)現(xiàn)

    一、背景在微服務架構(gòu)中,這里以開發(fā)環(huán)境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網(wǎng)關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環(huán)境或者
  • 三言兩語說透設計模式的藝術-單例模式

    寫在前面單例模式是一種常用的軟件設計模式,它所創(chuàng)建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統(tǒng)中的其他對象共享,從而減少
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 從零到英雄:高并發(fā)與性能優(yōu)化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構(gòu)師或者程序員,你是否曾經(jīng)為公司的系統(tǒng)在面對高并發(fā)和性能瓶頸時感到手足無措或者焦頭爛額呢?筆者在出道那會為此是吃盡了苦頭的,不過也得
  • 小紅書1周漲粉49W+,我總結(jié)了小白可以用的N條漲粉筆記

    作者:黃河懂運營一條性教育視頻,被54萬人&ldquo;珍藏&rdquo;是什么體驗?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點贊!更瘋狂的是,這
  • 花7萬退貨退款無門:誰在縱容淘寶珠寶商家造假?

    來源:極點商業(yè)作者:楊銘在淘寶購買珠寶玉石后,因為保證金不夠賠付,店鋪關閉,退貨退款難、維權(quán)無門的比比皆是。&ldquo;提供相關產(chǎn)品鑒定證書,支持全國復檢,可以30天無理由退換貨。&
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起&ldquo;馮提莫&rdquo;這個名字,很多網(wǎng)友或許聽過,但應該不記得她是哪位主播了。其實,作為曾經(jīng)的&ldquo;斗魚一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現(xiàn)
  • 三星折疊屏手機去年銷售近1000萬臺 今年目標定為1500萬

    7月29日消息,三星率先發(fā)力可折疊手機市場,在全球市場已經(jīng)取得了非常亮眼的成績,接下來會進一步鞏固和擴大這一優(yōu)勢。三星在推出Galaxy Z Flip5和Galax
Top 主站蜘蛛池模板: 承德市| 囊谦县| 深州市| 万盛区| 怀集县| 洪雅县| 五莲县| 射阳县| 台东县| 永康市| 酒泉市| 遂溪县| 南木林县| 毕节市| 朔州市| 永康市| 启东市| 中江县| 昌宁县| 和硕县| 南开区| 永吉县| 平陆县| 新营市| 扬州市| 桑日县| 凤庆县| 东平县| 长兴县| 旅游| 广南县| 阿拉善左旗| 城固县| 满洲里市| 深水埗区| 水城县| 安平县| 海城市| 武夷山市| 通海县| 武清区|