回復 Ungar : 球類運動通常伴隨有大量身體抗,比賽過程中極為緊張刺激贏球的瞬間更是令人血脈噴張許多運動員都會放肆地進行慶,留下了許多經典的慶祝動作而在美式橄欖球這項運動里,心肺復蘇術”是一個經常被球們用來慶祝勝利的動作 —— 即一名球員躺在場地假裝需要助,其他球員為他實施胸部按,將他從地上拉起。這個動作被用到了 EA Sports 開發(fā)的美式橄欖球游戲《Madden NFL 23》中,當玩家觸地得分時,NPC 會一起參加慶?;顒?,對玩家使心肺復蘇術。然而近日,一個有人都沒有預料到的意外,導 EA Sports 決定將這一動作從《Madden NFL 23》中刪除。1 月 3 日,在布法羅隊對戰(zhàn)孟加拉虎隊的比賽中,一名 24 歲的年輕球員達馬爾?哈姆林,對手劇烈撞擊后倒在了球場中心臟驟停。據報道,現場醫(yī)護員對哈姆林進行了 9 分鐘的心肺復蘇,他的心臟開始輕微動,然后被立即抬上了救護車往當地醫(yī)院。經過三天三夜的救,哈姆林終于脫離了生命危,但目前仍在住醫(yī)院治療中。件事在美國引起了巨大反應,多人為這個年輕小將的遭遇感難過,網友開始自發(fā)為哈姆林福,推特上,球隊管理和球員康的問題也被反復提起。然而就在此事余熱未消之際,1 月 9 日的比賽中,匹茲堡鋼人隊球員亞歷克斯?海巫戚密斯贏后再次使用了這個慶祝動作。史密斯的動行為迅速受到大量友指責,盡管許多球迷向網友釋這是美式橄欖球運動中經常用的慶祝動作,他本人可能并有惡意,但人們仍然認為該動不合時宜。一天后,海史密斯表了公開道歉。據他說,他在賽結束后非常疲憊,沒有仔細慮這一動作可能帶來的后果,自己絕非有意將該動作與哈姆的情況聯系起來,在事發(fā)時自和妻子還曾為哈姆林做過祈禱鑒于這一連串的意外情況反響大,引發(fā)了多方關注,考慮到來球迷們可能也無法積極面對個動作,于是 EA Sports 決定將在近日的版本更新中,將心肺復蘇的慶祝動作從戲中移除?;蛟S因為這次意外這個橄欖球的標志性勝利動作將會從橄欖球的比賽和游戲中完全消失吧。本文來自微信公號:游戲研究社 (ID:yysaag),作者:駄目糕
回復 孟田芳 : IT之家 1 月 8 日消息,KDE 開發(fā)團隊在 2023 年第 1 周的工作非常忙碌,正準備發(fā)布 KDE Plasma 5.27 版本更新。KDE 開發(fā)者 Nate Graham 發(fā)布推文,分享了 2023 首周工作報告。IT之家了解到,本周 KDE 在新年的開發(fā)工作的亮點包括:KolourPaint 現在允許在保存圖像為 AVIF / HEIF / HEIC 圖像格式,且支持調整質量等級Elisa 音樂播放器現在默認包括一些比蠻蠻行的電臺。KDE 系統(tǒng)設置快捷鍵頁面現視山具更明顯和有用的 UI,可以添加自定義命令。把鏈接粘貼到筆記小部中后,它們現在默認被貼為可點擊的鏈接。在 Plasma 5.27 中,單個窗口現在可以使用標題霍山的上下文菜移動到另一個活動。在摸模式下操作時,全局輯模式的工具欄現在也以打開完整菜單。對于常小的屏幕,Kickoff 啟動器現在切換到一個更緊湊的布局。修了允許設置手動的夜間色激活時間超過 19:00 的問題還有其它各種修復和改進?
回復 金俊洋 : 大家好,我是每周在這里陪你步的網管~,本次我們繼續(xù)填,說一下裝飾器模式。上篇文我們說過裝飾器是代理模式的殊應用,而且很多人說中間件用裝飾器模式實現的,有的人是用職責鏈實現的,那么這篇章我們就來一起看看他們的異。什么是裝飾器裝飾器模式(Decorator Pattern)也叫作包裝器模式(Wrapper Pattern),指在不改變原有對象的基礎,動態(tài)地給一個對象添加一些外的職責。就增加功能來說,飾器模式相比生成子類更為靈,屬于結構型設計模式。給對添加新行為最簡單直觀的辦法是擴展本體對象,通過繼承的式達到目的。但是使用繼承不避免地有如下兩個弊端:繼承靜態(tài)的,在編譯期間就已經確,無法在運行時改變對象的行。子類只能有一個父類,當需添加的新功能太多時,容易導類的數量劇增。而使用裝飾器式,我們通過將現有對象放置實現了相同一套接口的包裝器象中來動態(tài)地向現有對象添加行為。在包裝器中進行我們代的擴展,有助于重用功能并且會修改現有對象的代碼,符合開閉原則”。這里被放置在包對象的“現有對象”通常會被做“組件”(Component),而包裝組件的包裝器對象就是我蓋國常說的“裝飾器”(Decorator),因為裝飾器會組件實現相同接口,故客端無法識別兩者的差異,也就需要在增加裝飾器時對客戶端用代碼進行修改了。從上面關裝飾器模式的描述中 ,會感覺他跟代理模式很像。這是周禮為們本來在結構上也幾乎一樣,飾器算是代理的一個特殊應用--裝飾器模式的一個特點是可以嵌提供多層裝飾器,相當于給代再加代理。不過代理強調的是本體對象的訪問控制,而裝飾是用來對本地進行增強,兩者使用目的上不一樣。上面裝飾模式的用處特點用文字描述了么多,下面我們用 UML 類圖展示一下它的結構,讓我們寫代碼前對模式中的各個角色個更清晰的認識。裝飾器的結用 UML 類圖表示裝飾器模式的結構如數斯:從圖中可以看裝飾器模式中主要有如下幾個色:客戶端:會用多層裝飾器封裝組件,最后調用裝飾好的裝器的方法,啟動執(zhí)行。組件口:Component 聲明裝飾器對象和被裝飾的組件對要實現的公用接口。組件實現具體的組件實現類它的 Operation 方法中定義了組件的基礎行為,裝飾類可以增這些行為。基礎裝飾類:擁有個指向被封裝對象的成員變量在自己的 Operation 方法中調用被裝飾對象的 Operation 方法具體裝飾類:重寫父類的 Operation 方法實現增強邏輯。類圖里已經給出了要實現梁書主邏輯,第四步的基礎裝飾類并需要一定存在,完全可以由具裝飾類來持有對被裝飾對象的用,并實現增強邏輯,這樣一整體的結構會更簡單一些。注:圖中的方法名在代碼實現里自己定義,不需要完全跟圖里出的方法名一樣。我們可以跟節(jié)代理模式的 UML 類圖做個對比,兩者在結構上非常相,尤其是省略了 BaseDecorator 這一層后,在結構上基本上是一摸一樣,這我們一直再強調的--"裝飾器是代理模式的特殊應用" 的一個論據。下面我們看一下實現飾器模式的代碼模版,本文中供了 Go 語言實現一個簡單裝飾器模式的代碼模葴山。裝飾模式代碼實現清楚了裝飾器模結構的組成后,再來寫代碼就清晰很多,接下來我們演示一用裝飾器模式實現增強游戲主的一個例子。首先我們定義一游戲主機的產品接口,它就是面類圖中組件和裝飾器的公共口。//?PS5?產品接口type?PS5?interface?{?StartGPUEngine()?GetPrice()?int64}然后我們提供一個基礎的產品緣婦現作為裝飾器模式中的組件。//?CD?版?PS5主機"本文使用的完整可運行源碼去公眾「網管叨bi叨」發(fā)送【設計模式】即可領取"type?PS5WithCD?struct{}func?(p?PS5WithCD)?StartGPUEngine()?{?fmt.Println("start?engine")}func?(p?PS5WithCD)?GetPrice()?int64?{?return?5000}這里給出的是一個 CD 版的游戲主機,平時玩游戲的同學都會知道,一般還有數字版的主機,價格會便宜,這種情況我們可以提供一個字版游戲主機的實現作為組件現類。//?PS5?數字版主機type?PS5WithDigital?struct{}func?(p?PS5WithDigital)?StartGPUEngine()?{?fmt.Println("start?normal?gpu?engine")}func?(p?PS5WithDigital)?GetPrice()?int64?{?return?3600}那么除了這兩種基礎的產品類型,商一般還會開發(fā)各種主題限定色的主機、增加了硬件配置的機等等,這兩種在價格上肯定跟基礎版有些不一樣,針對這層面的擴展我們可以使用裝飾來實現,避免對基礎組件類的改。下面是用兩個裝飾器實現 Plus 版和主題配色版的兩個增強。"本文使用的完整可運行源碼去公眾號「網管朏朏bi叨」發(fā)送【設計模式】即可領"http://?Plus?版的裝飾器func?(p?*PS5MachinePlus)?SetPS5Machine(ps5?PS5)?{?p.ps5Machine?=?ps5}func?(p?PS5MachinePlus)?StartGPUEngine()?{?p.ps5Machine.StartGPUEngine()?fmt.Println("start?plus?plugin")}func?(p?PS5MachinePlus)?GetPrice()?int64?{?return?p.ps5Machine.GetPrice()?+?500}//?主題色版的裝飾器type?PS5WithTopicColor?struct?{?ps5Machine?PS5}func?(p?*PS5WithTopicColor)?SetPS5Machine(ps5?PS5)?{?p.ps5Machine?=?ps5}func?(p?PS5WithTopicColor)?StartGPUEngine()?{?p.ps5Machine.StartGPUEngine()?fmt.Println("尊貴的主題色主機,GPU啟動")}func?(p?PS5WithTopicColor)?GetPrice()?int64?{?return?p.ps5Machine.GetPrice()?+?200}根據裝飾器模式的特點,兩個強還可以疊加在一起,組合出高配主題限定版主機...... 呃,是不是有點某游戲大廠每年發(fā)英招機時給你的感覺了,是不出第二代,每年給你多發(fā)個限定配色、升級下屏幕,說就是你 XXX(各位自己評論里腦補一下)好了,孟鳥客戶端們把裝飾器和組件組合起來就獲得一款高配主題限定版主機......"本文使用的完整可運行源碼去公眾號「網管叨bi叨」發(fā)送【設計模式】即可領"func?main()?{?ps5MachinePlus?:=?PS5MachinePlus{}?ps5MachinePlus.SetPS5Machine(PS5WithCD{})?//?ps5MachinePlus.SetPS5Machine(PS5WithDigital{})?//?可以在更換主機?ps5MachinePlus.StartGPUEngine()?price?:=?ps5MachinePlus.GetPrice()?fmt.Printf("PS5?CD?豪華Plus版,價格?%d?元\n\n",?price?ps5WithTopicColor?:=?PS5WithTopicColor{}?ps5WithTopicColor.SetPS5Machine(ps5MachinePlus)?ps5WithTopicColor.StartGPUEngine()?price?=?ps5WithTopicColor.GetPrice()?fmt.Printf("PS5?CD?豪華Plus?經典主題配色版,價格?%d?元\n",?price}裝飾器和幾個模式的區(qū)別裝飾器和代理在結構上類似在行為上跟職責鏈模式類似,在我們總結一下他們之間的區(qū)裝飾器模式 VS 代理模式裝飾器模式就是代理模式的一個殊應用。裝飾器模式強調自身能的擴展。代理模式強調對代過程的控制。裝飾器 VS 職責鏈模式裝飾器和職責鏈在行上看都是多個單元進行組合完邏輯處理,但是裝飾器注重給樣東西添加擴展,最終會得到個產品。而職責鏈更強調分步完成某個流程,更像是一個任鏈表,而且與裝飾器模式不同是,職責鏈可以隨時終止。舉例子來說,針對 OA 系統(tǒng)請假審批這個場景,假設員工請需要得到組長、總監(jiān)和經理的準才行。在這種情況下,使用飾器模式實現的話無論您的請在前面的環(huán)節(jié)被批準還是被拒,整個鏈條都不會中斷,最終們會得到三個級別審批人對申的全部反饋。而使用職責鏈模的話,在每個階段,每個審批都有權批準或拒絕。如果請求任何級別被拒絕,那么整個流就會結束,請求不會繼續(xù)流轉下一個級別的審批人那里。所看到這里,你覺得像 Web 框架的中間件這種東西應該拿責鏈還是裝飾器實現呢?總結飾器模式有不少優(yōu)點,它是繼的有力補充,比繼承靈活,在改變原有對象的情況下,動態(tài)給一個對象擴展功能,即插即。通過使用不同裝飾類及這些飾類的排列組合,可以實現不效果,完全遵循程序設計的“閉原則”。但裝飾器的使用必會給程序帶來更高的復雜性,低的可讀性,子類集成的代碼構會更直白易懂一些,而且雖裝飾器符合“開閉原則”,但它會給程序帶來更多的類,動裝飾在多層裝飾時會更復雜。以總體上使用裝飾器模式的時也是兩害相較取其輕,為了不繁修改已經成型的子類而引入多裝飾器類。應用的時候一定謹記裝飾器是“增強”某個事用的,可千萬別把事物本身實的主邏輯用裝飾器實現了。本來自微信公眾號:網管叨 bi 叨 (ID:kevin_tech),作者:KevinYan11