Quantcast
Channel: 系統分析與設計 – Kenmingの鮮思維
Viewing all articles
Browse latest Browse all 33

從西遊記孫悟空大戰牛魔王看 Proxy 代理者模式

$
0
0

前言

在《西遊記》中,孫悟空對戰牛魔王的經典橋段就是應用 Proxy 代理者模式的好範例。

孫悟空與牛魔王的惡鬥過程中,他拔毫毛變出數十個分身,每個都手持金箍棒與牛魔王展開激烈戰鬥。而當分身仍無法取勝,悟空本尊便會駕雲上天,請來諸佛神仙助陣,最終化解危機。

孫悟空拔毫毛變出分身,這些分身就是 Proxy。分身可以代替孫悟空執行任務(如纏住牛魔王),而孫悟空本體則專注於核心戰鬥。這種方式不僅提升了效率,也降低了本體的風險。

悟空分身顯神通 – 代理模式破牛魔

「好魔王,他也有七十二變,武藝也與大聖一般,只是身子狼犺些,欠鑽疾,不活達些。把寶劍劈臉來砍,這大聖將金箍棒幌一幌,碗來粗細,任他乒乒乓乓削得火星亂迸,再不離身。這大聖抖擻神威,搖身一變,變得與那牛魔王一般模樣,舉鐵棒劈頭來砸。那魔王就現出本相,大膽獬豸,口似血盆,牙如劍戟。

這大聖也就現了法身,掄起金箍棒,著頭便打。他兩個鬥經五十回合,不分勝負......行者見他兇猛,即使身外身法,拔一把毫毛,丟在口中嚼碎,噴將出去,叫聲『變!』即變做三五十個小猴,一擁上前,把那魔王纏住,抱腿的抱腿,扯腰的扯腰,抓眼的抓眼,挦毛的挦毛。那牛王急得暴躁,搖身一抖,復本相,徑投北方敗去。」

代理模式的範例 - 孫悟空分身大戰牛魔王

孫悟空拔毫毛變出分身,正是應用了代理人 (Proxy) 模式:

  • 原始對象:孫悟空本尊,擁有強大的戰鬥能力。
  • 代理對象:毫毛變出的分身,作為孫悟空的代理,執行戰鬥任務。
  • 代理功能:分身可以代替本尊進行戰鬥,分散牛魔王的注意力,同時保護本尊免受直接攻擊。

可以使用 UML 類別圖表達以上的結構關係:

從牛魔王 (Client) 的角度來看,牠不知道打鬥的對象誰才是本尊,孫悟空本尊與分身都是孫悟空 (介面,ISubject),都具有「打鬥」的行為。

孫悟空眾多的分身均是孫悟空本尊的「替身 (proxy)」,祂們都直接面對牛魔王進行戰鬥。而當替身無法取勝時,替身就會呼叫孫悟空本尊 (real subject) 直接戰鬥。當本尊也打不過時,祂可以私底下到天庭找諸佛神仙助陣,一同收服妖怪。

Proxy 模式核心概念

定義與目的

  • 定義:為某個物件提供一個代理者,以控制對該物件的存取。
  • 目的:
    • 控制對實際物件的存取。
    • 保護對實際物件的存取權限。
    • 在不改變實際物件的前提下添加額外功能。
    • 降低系統資源消耗,提升效能。

主要參與者

  • 主要參與者:
    • Subject (主題):定義 RealSubject 與 Proxy 的共同介面,確保客戶端可以使用相同方式操作。
    • Proxy (代理者):持有 RealSubject 的參考,提供與 Subject 相同的介面,控制對 RealSubject 的存取。
    • RealSubject (真實主題):定義 Proxy 所代表的真實物件。
  • 物件合作:
    • Client 透過 Subject 介面與 Proxy 互動,Proxy 接收請求後,根據需要決定是否轉發給 RealSubject。

應用效果

  • 降低系統資源耗費。
  • 增添額外功能。
  • 控制存取的靈活度。

應用實例與時機

應用實例

  • 電子商務用戶區分本地與境外的註冊
  • Web 瀏覽器快取。
  • 多人線上遊戲等級控管。
  • 資料庫連線的管理。
  • 大型物流系統的跨區節點通訊。

應用時機

  • 遠端代理:封裝遠端物件的複雜連線細節。
  • 虛擬代理:代理者可以先做最佳化的處理工作,例如大型圖檔或文件為節省資源,只有當需要時才建立實際物件。
  • 保護代理:當需要控制對目標物件的存取權限時。
  • 智能代理:可以控制對實際物件存取的方法或執行額外的操作時,例如調用快取。

原文摘錄 ( 第61回 - 豬八戒助力敗魔王 孫行者三調芭蕉扇 )

那魔王見八戒凶猛,即騰空跳起,掣出那柄七星劍,架住釘鈀,又鬥了幾合。這八戒是個粗莽人,見他趕得緊,把釘鈀幌一幌,丟了架子,縱身跳起,兩隻前蹄,緊抱定牛王,口里啃他肉,牙上錯他皮。那魔王慌得把劍亂砍,砍不退,卻又叫:「大聖,這涎蟲好不達理,怎麼抱住我身,又啃又咬,是甚麼禮節!」行者笑道:「你只管廝打,休得話說。他若撒了口,定然被你捉了。」八戒聽見叫他,越加努力,把牛王抱緊緊的,莫想脫身。

行者見他抱住,卻轉身來,輪起鐵棒,望牛王劈頭就打。那魔王慌得把左臂架住鐵棒,右手輪劍來剁八戒。八戒撒口,跳離身外,掄釘鈀又帶住他腿腳。行者見他不能迎敵,卻又使一個身外身法,把尾巴上毫毛拔下幾根,嚼得粉碎,望空噴去,叫聲「變!」變作百十個小行者,都使鐵棒,齊打牛王。那魔王抵敵不住,敗下陣來。八戒趕上,又要揪住,行者急止住道:「兄弟,且饒他去罷。」八戒道:「哥哥,正好擒他,取他扇子,怎麼又放他去?」行者道:「兄弟,你不曾理會。若是打殺他,我們就無緣得他的扇子。且饒他去,只在他穴中,必有扇子。我們尋著他穴,說出利害,他一定害怕,那時送我們扇子,卻不是更便宜?」八戒聞言,只得回身。

那魔王得命,負痛逃生,徑轉洞裡,對那公主道:「奶奶,不好了,不好了!」公主問:「為何這等慌張?」魔王道:「被那孫行者引一個豬八戒,十分兇猛。我與他鬥了幾合,他就丟了器械,跳上來抱住我身,口啃肉,牙錯皮,弄得我莫想脫身。孫行者又使一個身外身法,變作許多行者,都使鐵棒來打,是我一時難敵,敗陣逃生,喪了鬥志回來也。」

[…]

行者見他兇猛,即使身外身法,拔一把毫毛,丟在口中嚼碎,噴將出去,叫聲「變!」即變做三五十個小猴,一擁上前,把那魔王纏住,抱腿的抱腿,扯腰的扯腰,抓眼的抓眼,挦毛的挦毛。那牛王急得暴躁,搖身一抖,復本相,徑投北方敗去。

孫悟空也現出了真身,舉起金箍棒,對著牛魔王的頭就打。他們兩個打鬥了五十回合,不分勝負。

孫悟空見牛魔王非常兇猛,就使用了分身法術,拔下一把毫毛,放在嘴裡嚼碎,然後噴出去,大喊一聲「變!」毫毛立即變成了三、五十個小猴子。這些小猴子一擁而上,纏住了牛魔王:有的抱住他的腿,有的扯他的腰,有的抓他的眼睛,有的拔他的毛髮。

牛魔王被弄得非常暴躁,他搖動身體抖了一下,恢復了原形,直接往北方逃跑了。

前文中還描述了豬八戒如何助力對抗牛魔王,他曾經抱住牛魔王又啃又咬,讓牛魔王無法脫身。這是西遊記中師徒一行人為了取得芭蕉扇過火焰山的故事情節之一,相當生動!


Viewing all articles
Browse latest Browse all 33

Trending Articles