設計模式入門:訪問者模式 Visitor Pattern

更新於 2024/09/15閱讀時間約 2 分鐘

想像你是一位探險家,走進了一座神秘古城。這座城裡有著各種各樣的建築:宏偉的宮殿、莊嚴的神廟、熱鬧的市集。每個地方都有它獨特的風格和探索方式。作為探險家,你必須用不同的方法來了解每個地方,但你不需要改變這些建築本身,只要隨著地方變化調整探索的方式。這就是訪問者模式的精髓!


什麼是訪問者模式?

訪問者模式是一種設計模式,讓你在不修改物件本身的情況下,對其新增行為。換句話說你可以在不打擾物件原本結構的前提下,隨時加入新操作。這就像探險家去不同地方探索,每個地方不需要變,但探險家可以隨意選擇要怎麼探索。


繪圖軟體的應用

假設你正在開發一個繪圖軟體,裡面有圓形、矩形、三角形等圖形。突然接到一個新需求:計算每個圖形的面積。此時訪問者模式就派上用場,我們可以為每個圖形新增一個"訪問者",讓這個訪問者負責計算圖形的面積,而不用改變圖形本身的程式碼。


這樣一來,當你日後想再新增計算周長、顯示圖形等功能時,只需再新增相應的訪問者,而圖形類別本身則不需要動。


檔案系統中的應用

訪問者模式也常用在檔案結構分析中。想像有一個複雜的檔案系統,裡面有檔案和資料夾。你想統計每個資料夾內所有檔案的大小,這時你可以用一個訪問者來遍歷這些檔案和資料夾,並計算出總大小。只需要增加訪問者就能新增不同的操作,比如計算檔案數量、顯示目錄結構等。


訪問者模式優缺點

訪問者模式的好處是它遵守「開閉原則」,讓你在不改變物件結構的前提下,輕鬆新增功能。而且訪問者可以集中處理某一類操作,讓程式碼更容易閱讀、容易管理。


但缺點是若物件結構經常變動,你就得頻繁更新訪問者的程式碼,這會增加維護成本。對於物件類型很多的情況,訪問者也會變得難以管理,因為每新增一種類型,都必須在訪問者裡新增對應的邏輯。


總結一下,訪問者模式非常適合那些物件結構穩定、但需要經常新增行為的系統。它讓我們可以靈活地擴展系統功能,而不影響原有結構。不過在結構變化頻繁或物件種類繁多的系統中,訪問者模式可能會帶來額外的維護挑戰。


這次探索完訪問者模式的神秘古城,讓我們在未來的開發旅途中靈活運用這個模式,輕鬆解鎖更多可能性!


若想一探設計模式的奧秘,不妨參考我在iThome鐵人賽的文章。
https://ithelp.ithome.com.tw/articles/10350996

    avatar-img
    6會員
    83內容數
    對於經營自媒體、部落格或社群媒體感興趣?我專注於提供實用的寫作技巧、數位行銷策略,以及個人成長建議。 每週,我會分享提升寫作技巧、優化部落格經營、有效管理社群媒體、以及投資理財的寶貴知識。追蹤我,獲得實用的工具和建議,讓你的個人品牌和財務管理更上一層樓!
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    ShengYu的沙龍 的其他內容
    想像你有一個非常珍愛的玩偶,這個玩偶獨一無二。如果你想要再擁有一個完全相同的玩偶,你會怎麼做呢?自己重新製作一個,可能需要很多時間和心力,但如果有一台神奇的「複製機」,只需按下按鈕,就可以立即產生一個一模一樣的玩偶,這會不會很輕鬆方便?這就是「原型模式(Prototype Pattern)」的核心概
    你有沒有玩過大型多人線上遊戲(MMO)?畫面上常常出現數百甚至數千名玩家,每個人都有不同的外觀和裝備。這時你有沒有想過,遊戲是怎麼在記憶體不爆炸的情況下管理這麼多角色的?其中一個祕密就是「享元模式」! 什麼是享元模式? 享元模式是一種設計模式,專門用來解決當系統中有大量相似物件時,如何有效減
    大家有沒有想過,當你在終端機輸入指令,或是用正則表達式進行搜尋時,背後的運作原理是什麼?這些操作看似複雜,但其實背後隱藏著一個叫做「解釋器模式」的設計模式,今天就來聊聊這個神奇的模式。 什麼是解釋器模式? 簡單來說解釋器模式是一種用來處理語法規則的設計模式。它的運作方式就像我們學習一門語言,
    想像一下你家裡的電視遙控器。這個遙控器能夠控制不同品牌的電視,無論是開機、關機還是調整音量,它都能輕鬆搞定。遙控器就像是橋接不同電視的中介,讓你只需要按下按鈕,就能控制電視,而不用擔心每台電視的內部細節。這就是橋接模式的精髓:把「操作」和「具體實現」分開,讓它們可以獨立發展。 什麼是橋接模式?
    想像一下你在公司遇到一個棘手的問題。你會怎麼做?通常的做法是先跟你的主管報告,發現他解決不了,就再往上報告給更高層的主管,如果還是解決不了就再往上報告給更高層,這樣層層往上,直到有人可以處理為止。這就是「責任鏈模式」的概念,將任務一步步傳遞,直到問題被解決。 什麼是責任鏈模式? 責任鏈模式是
    你有沒有曾經正在玩一個遊戲,剛剛過了一個超難的關卡,但突然手滑點錯選項,整個進度被重置了?這時候你一定會希望有個「存檔」功能,能讓你回到之前的關卡。這正是備忘錄模式 Memento Pattern 想解決的問題。 備忘錄模式讓我們能夠保存某個物件的狀態,並在需要時還原這些狀態,像是一個「後悔藥
    想像你有一個非常珍愛的玩偶,這個玩偶獨一無二。如果你想要再擁有一個完全相同的玩偶,你會怎麼做呢?自己重新製作一個,可能需要很多時間和心力,但如果有一台神奇的「複製機」,只需按下按鈕,就可以立即產生一個一模一樣的玩偶,這會不會很輕鬆方便?這就是「原型模式(Prototype Pattern)」的核心概
    你有沒有玩過大型多人線上遊戲(MMO)?畫面上常常出現數百甚至數千名玩家,每個人都有不同的外觀和裝備。這時你有沒有想過,遊戲是怎麼在記憶體不爆炸的情況下管理這麼多角色的?其中一個祕密就是「享元模式」! 什麼是享元模式? 享元模式是一種設計模式,專門用來解決當系統中有大量相似物件時,如何有效減
    大家有沒有想過,當你在終端機輸入指令,或是用正則表達式進行搜尋時,背後的運作原理是什麼?這些操作看似複雜,但其實背後隱藏著一個叫做「解釋器模式」的設計模式,今天就來聊聊這個神奇的模式。 什麼是解釋器模式? 簡單來說解釋器模式是一種用來處理語法規則的設計模式。它的運作方式就像我們學習一門語言,
    想像一下你家裡的電視遙控器。這個遙控器能夠控制不同品牌的電視,無論是開機、關機還是調整音量,它都能輕鬆搞定。遙控器就像是橋接不同電視的中介,讓你只需要按下按鈕,就能控制電視,而不用擔心每台電視的內部細節。這就是橋接模式的精髓:把「操作」和「具體實現」分開,讓它們可以獨立發展。 什麼是橋接模式?
    想像一下你在公司遇到一個棘手的問題。你會怎麼做?通常的做法是先跟你的主管報告,發現他解決不了,就再往上報告給更高層的主管,如果還是解決不了就再往上報告給更高層,這樣層層往上,直到有人可以處理為止。這就是「責任鏈模式」的概念,將任務一步步傳遞,直到問題被解決。 什麼是責任鏈模式? 責任鏈模式是
    你有沒有曾經正在玩一個遊戲,剛剛過了一個超難的關卡,但突然手滑點錯選項,整個進度被重置了?這時候你一定會希望有個「存檔」功能,能讓你回到之前的關卡。這正是備忘錄模式 Memento Pattern 想解決的問題。 備忘錄模式讓我們能夠保存某個物件的狀態,並在需要時還原這些狀態,像是一個「後悔藥
    你可能也想看
    Google News 追蹤
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    東京幻視藝術館裡,展示著超多藝術作品,讓每一位遊客都能在這裡體驗到獨特的視覺盛宴。利用人類視覺的錯覺,創造出角度不同看起來完全不同的三維空間。走入這個神秘的空間裡,每一幅作品都充滿了驚奇與趣味,從特定的角度拍照,人和背景完全融為一體了呢!
    Thumbnail
    旅程的一開始,我問孩子們:「你們聽說過博物學嗎?有在哪些地方聽過?」 四面傳來疑惑的眼光。 於是我再問:「那有聽過博物館嗎?」 這次得到的回應就肯定許多。
    Thumbnail
    融合了藝術與歷史 華山文創園區,一個融合了現代藝術與歷史文化的地方,總是吸引著各式各樣的人來這裡尋求靈感和放鬆。在這個充滿創意的氛圍中,我找到了位於一個角落的小酒館,決定坐下來進行一場街頭速寫。 樹蔭下 這家小酒館隱身於華山文創的樹蔭下,門口擺放著幾張木質桌椅,給人一種既溫馨又隨性的感覺。我選
    Thumbnail
    今早去芬寧堡宮,去程電車上買好優惠連票,15歐,可以看主宮殿,還有阿美琳堡狩獵小屋與宮廷馬廄博物館,先買妥是對的,現場排隊好幾列,我只要拿出手機在入口處掃QR CODE即放行。 宮殿外表簡單低調不像皇宮,倒像是辦公廳,一入內竟是無比奢華。其他兩地也是,阿美琳銀光閃閃,狩獵小屋還這麼貴氣,果然皇室才
    Thumbnail
    我們向櫃臺人員詢問搭往奇美博物館的公車路線。即使我曾多次造訪奇美美術館,但以前都是依賴著家人開車前往,這次是我們首次自行搭車,帶來了不同的新鮮與冒險感受。 下車後我們在美術館前的阿波羅噴泉前拍照留念,將行李放在行李櫃後,跟隨人潮進入展館。展館內一波又一波湧入的人潮令人驚嘆,難以想像假日參觀的熱鬧景
    Thumbnail
    這是在故宮山下大門畫的,整個故宮看起來很有威嚴氣勢。當我站在故宮山下大門,仔細觀察那高大的門樓和精美的雕刻,仿佛能夠穿越時空,感受到當時建造這些偉大建築時的用心與技藝。 故宮的設計不僅追求實用功能,更注重美感和象徵意義。門樓上的每一處磚瓦、每一塊石材,都蘊含著深厚的文化內涵,讓人不禁讚歎古人的智慧
    Thumbnail
    在這個忙碌的世界中,透過旅行來尋找真正渴望的東西。在首爾博物館的感悟和旅行的體驗中,作者分享了對旅行的回憶、突破和觀察。通過對比不同國家的文化和風俗,作者思考了臺灣的全球化和文化定位問題。
    Thumbnail
    最近在閱讀《巴黎哲學藝術地圖》一書時,時常因為內文提及許多巴黎的地標、文明的建築物、巴黎第一間咖啡館等地而回想起四年前在歐洲交換、旅遊的日子。
    Thumbnail
    如果問我什麼是行程清單上無法刪除的點,那一定是博物館。對我而言,博物館是打開一座城市最有效率的方式,你可以在一棟建築內認識這座城市的前世今生,瞭解他的風格品味,再帶著這些即時的認識走進城市,那種像是與城市互動或反覆驗證所知的感覺,是我在旅行裡最大的趣味。
    Thumbnail
    無論看見了多少臺階, 無論走遍了多少街道, 也不管覆蓋屋頂的是什麼, 或者那片牆的建材有多特殊... 組成一座城市的不是那些, 而是「空間量度」與「過去事件」的關係, 欄杆的高度與翻過欄杆的志願者, 漁網的破洞與修補的老人們閒聊著話當年, 這些記憶, 清晰或模糊的過往, 城市被一
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    東京幻視藝術館裡,展示著超多藝術作品,讓每一位遊客都能在這裡體驗到獨特的視覺盛宴。利用人類視覺的錯覺,創造出角度不同看起來完全不同的三維空間。走入這個神秘的空間裡,每一幅作品都充滿了驚奇與趣味,從特定的角度拍照,人和背景完全融為一體了呢!
    Thumbnail
    旅程的一開始,我問孩子們:「你們聽說過博物學嗎?有在哪些地方聽過?」 四面傳來疑惑的眼光。 於是我再問:「那有聽過博物館嗎?」 這次得到的回應就肯定許多。
    Thumbnail
    融合了藝術與歷史 華山文創園區,一個融合了現代藝術與歷史文化的地方,總是吸引著各式各樣的人來這裡尋求靈感和放鬆。在這個充滿創意的氛圍中,我找到了位於一個角落的小酒館,決定坐下來進行一場街頭速寫。 樹蔭下 這家小酒館隱身於華山文創的樹蔭下,門口擺放著幾張木質桌椅,給人一種既溫馨又隨性的感覺。我選
    Thumbnail
    今早去芬寧堡宮,去程電車上買好優惠連票,15歐,可以看主宮殿,還有阿美琳堡狩獵小屋與宮廷馬廄博物館,先買妥是對的,現場排隊好幾列,我只要拿出手機在入口處掃QR CODE即放行。 宮殿外表簡單低調不像皇宮,倒像是辦公廳,一入內竟是無比奢華。其他兩地也是,阿美琳銀光閃閃,狩獵小屋還這麼貴氣,果然皇室才
    Thumbnail
    我們向櫃臺人員詢問搭往奇美博物館的公車路線。即使我曾多次造訪奇美美術館,但以前都是依賴著家人開車前往,這次是我們首次自行搭車,帶來了不同的新鮮與冒險感受。 下車後我們在美術館前的阿波羅噴泉前拍照留念,將行李放在行李櫃後,跟隨人潮進入展館。展館內一波又一波湧入的人潮令人驚嘆,難以想像假日參觀的熱鬧景
    Thumbnail
    這是在故宮山下大門畫的,整個故宮看起來很有威嚴氣勢。當我站在故宮山下大門,仔細觀察那高大的門樓和精美的雕刻,仿佛能夠穿越時空,感受到當時建造這些偉大建築時的用心與技藝。 故宮的設計不僅追求實用功能,更注重美感和象徵意義。門樓上的每一處磚瓦、每一塊石材,都蘊含著深厚的文化內涵,讓人不禁讚歎古人的智慧
    Thumbnail
    在這個忙碌的世界中,透過旅行來尋找真正渴望的東西。在首爾博物館的感悟和旅行的體驗中,作者分享了對旅行的回憶、突破和觀察。通過對比不同國家的文化和風俗,作者思考了臺灣的全球化和文化定位問題。
    Thumbnail
    最近在閱讀《巴黎哲學藝術地圖》一書時,時常因為內文提及許多巴黎的地標、文明的建築物、巴黎第一間咖啡館等地而回想起四年前在歐洲交換、旅遊的日子。
    Thumbnail
    如果問我什麼是行程清單上無法刪除的點,那一定是博物館。對我而言,博物館是打開一座城市最有效率的方式,你可以在一棟建築內認識這座城市的前世今生,瞭解他的風格品味,再帶著這些即時的認識走進城市,那種像是與城市互動或反覆驗證所知的感覺,是我在旅行裡最大的趣味。
    Thumbnail
    無論看見了多少臺階, 無論走遍了多少街道, 也不管覆蓋屋頂的是什麼, 或者那片牆的建材有多特殊... 組成一座城市的不是那些, 而是「空間量度」與「過去事件」的關係, 欄杆的高度與翻過欄杆的志願者, 漁網的破洞與修補的老人們閒聊著話當年, 這些記憶, 清晰或模糊的過往, 城市被一