你有張良計,我有過牆梯之策略模式

2021-01-09 騰訊網

0x01:策略模式簡介

策略模式指對象有某個行為,但是在不同的場景中,該行為有不同的實現算法。比如每個人都要交個人所得稅,但是根據個人的收入情況,個人所得稅的計算算法是有不同的策略的。

我想大家都看過《三國演義》,其中劉備娶孫夫人時,諸葛亮交給趙雲三個

錦囊,就是三個策略

錦囊一:到達東吳,先去拜會喬國老

錦囊二:劉備貪念美色不思離開,就對他謊稱曹操大軍壓境

錦囊三:如果被東吳軍隊追趕,求孫夫人解圍

策略模式的UML類圖如下:

主要角色分析:

抽象策略角色(Strategy):策略類,通常由一個接口或者抽象類實現;

具體策略角色(ConcreteStrategyA):包裝了相關的算法和行為;

上下文角色(Context):持有一個策略類的引用,最終給客戶端調用;

Context是上下文,用一個ConcreteStrategy來配置,維護一個Strategy對象的引用;Strategy是策略類,用於定義所有支持算法的公共接口;ConcreteStrategy是具體策略類,封裝了具體的算法或行為,繼承於Strategy。

0x02:策略模式實現

Context:Context上下文角色,也叫Context封裝角色,起承上啟下的作用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化。

Strategy:抽象策略角色,是對策略、算法家族的抽象,通常為接口,定義每個策略或算法必須具有的方法和屬性。algorithm是運算法則的意思。

ConcreteStrategy:具體策略角色,用於實現抽象策略中的操作,即實現具體的算法,下方用print代替。

策略模式測試代碼:可以依次更換策略,測試一下策略模式。

0x03:策略模式在JDK的運用

在多線程編程中,經常使用線程池來管理線程,以減緩線程頻繁的創建和銷毀帶來的資源的浪費,其中ThreadPoolExecutor類中的RejectedExecutionHandler參數就是一個使用了策略模式的典型例子。

ThreadPoolExecutor的構造函數

RejectedExecutionHandler接口

RejectedExecutionHandler的四種策略實現

CallerRunsPolicy:該策略並沒有拋棄任何的任務,由於線程池中已經沒有了多餘的線程來分配該任務,該策略是在當前線程(調用者線程)中直接執行該任務;

AbortPolicy:該策略是直接將提交的任務拋棄掉,並拋出RejectedExecutionException異常;

DiscardPolicy:該策略也是將任務拋棄掉(對於提交的任務不管不問,什麼也不做),不過並不拋出異常。

DiscardOldestPolicy:該策略是當執行器未關閉時,從任務隊列workQueue中取出第一個任務,並拋棄這第一個任務,進而有空間存儲剛剛提交的任務。使用該策略需要特別小心,因為它會直接拋棄之前的任務。

相關焦點

  • 「雙11」促銷可以有花樣,但別耍花招
    打折促銷手段方式的多樣化,是商家之間競爭激烈化、營銷策略多元化的表現,符合市場競爭規律和商業發展趨勢,但不意味著可以耍花招矇騙消費者。「不是我不明白,這世界變化快」,時下這句網絡流行語成了人們吐槽「雙11」花式打折促銷的生動註腳,各類促銷規則之繁複,真可謂「亂花漸欲迷人眼」。其實消費者更為關心的問題是:這種千奇百怪的促銷規則究竟是真打折還是假優惠?打折促銷真有必要搞出這麼多花樣嗎?  其實,打折促銷方式作為商家的經營策略手段,不可能一成不變,多一些打折花樣未嘗不可。
  • 看破不說破的4星座,睿智又低調,真正的大智若愚之人
    可你有你的張良計,對方也有自己的過牆梯。對於你的小心眼,早已看得透透的。所以,你的心眼再多,也並不是對所有的人都適用。總會慧眼如炬的人,早已看穿你的陰謀。看看十二星座中,看破不說破的4星座,睿智又低調,真正的大智若愚之人。是你嗎?
  • 葉正綱:共建品牌之策略模式
    共建品牌之策略模式  根據前述之研究回顧,共建品牌之策略模式大略可區分為兩個主要層面:  1. 雙方母品牌的互補性本質。  2. 各個母品牌之間的互補性本質對產品價值的貢獻。  區分品牌互補性本質最有效的方法,就是去解析整個產品所帶給顧客有形及無形的利益點。
  • 「寧娶從良女,不娶過牆妻」,「過牆妻」為什麼不能娶
    老話說「寧娶從良女,不要過牆妻」,何謂「過牆妻」?首先講講「從良妓」對於「妓女「這個詞很多人都會認為是她們好吃懶做,不知羞恥,頂多不過迫於生計才走上這條道。但是你這是現代人的思維來考慮古代,在古代很多女孩都沒有選擇因為古代」重男輕女「的思想緣故很多女孩為了自己和家人的生活根本沒法選擇,有人是被轉賣的,有人是被拐騙的,總之,自覺從業者幾乎沒有。再來講講他們的品質,她們雖然沒法改變自己的出身和生存方式但是可以保持自己的品德要想從事這種特殊職業,光有漂亮的臉蛋是不行的,還得有真才實學,就是大家常說的「琴棋書畫」,樣樣能通。
  • ABAP與設計模式之策略模式
    【IT168 技術文章】    首先介紹策略模式的基本內容    1. 意圖:    定義一系列算法,把他們一個個的封裝起來,並且使他們可以互相替換.本模式可以使得算法可以獨立於使用他的客戶而變化.    2. 結構:    3.
  • 可沒有聖母心的4個星座,你敢得罪,他們就敢以彼之道還施彼身
    在家裡不管你有什麼小情緒,父母都不會和你計較。但是到了外面,沒人會包容你的脾氣,大度的人也許不把你的話放在心上,但是你能保證每個人都這麼大度嗎?今天你讓他們不開心,明天他們讓你欲哭無淚。你拿雙子對你的好,當作傷害他們的資本,既然你不仁,那就別怪他們對你不義,敢得罪雙子,那就一定會讓你交一些學費,省著日後不長記性。
  • 生活中難免會遇到小人,鬼谷子教你3招,讓小人知難而退
    當你落難時不但不會幫助你,還會落井下石。攀附權貴,為了利益可以不擇手段。遇到這種人,真是甩都甩不掉。但是不用擔心要在幾千年前,就有一個了不得的傳奇人物,給我們想出了對待小人的辦法。此人就是縱橫家鬼谷子,戰國時期風雲人物蘇秦和張儀是縱橫家的代表,他們都是師從鬼谷子。鬼谷子學識淵博,知曉天文地理,精通識人之術。對人性的透徹研究無人能及,深知人性的各種弱點。
  • 最令人頭痛鬧心的便是「小人」,教你三個妙招,逼退小人
    如果你落魄時不僅不會幫到你,還可能會冷嘲熱諷。攀附權勢,因為利益能夠不擇手段。碰到這種人,簡直甩都甩不掉。然而 不必擔心要在數千年前,就有一個了不得的傳奇人物,給大家想到了正確對待小人的方法。此人便是縱橫家鬼谷子,春秋戰國時代傑出人物蘇秦和張儀是縱橫家的代表,這些人基本都是師從於鬼谷子。鬼谷子知識淵博,知曉天文地理,精通辨人之術。對人性的透徹研究無人能及,深知人性的各種弱點。
  • 從天秤座的肖戰與獅子座蔡徐坤對比,來解析天秤座的過人之處
    星座的「標籤」,就猶如是「我覺得什麼應該是什麼樣」,也就是看了「龜兔賽跑」的故事以後,就會感覺每一隻「兔子」都會「驕傲」,最終獲勝的都是「烏龜」一樣。 這就是「天秤座」與「獅子座」的不同,「天秤座」深知「為人之道」,該「低調的時候低調」,對於「人設」一絲不苟的追求,願意默默承受「指責」,你有「張良計」,我有「過牆梯」的「應對策略
  • 看龍嶺迷窟學經濟之:胡八一勇破西周機關懸魂梯,困卦之中的解卦
    探險懸疑劇《鬼吹燈之龍嶺迷窟》正在熱播,摸金四人組與馬大膽一票豬隊友進入魚骨廟,去鬥智風水大師「李淳風」!有《十六字陰陽風水秘術》傍身,還有主角光環加持的老胡,與一千年多前的李淳風隔空鬥法,端的足夠燒腦!李淳風史上神書《推背圖》的兩位作者之一,更是難得的涉及到皇家御用國師身份的風水大師,而壽終正寢的人物。
  • 古人講:「寧可迎娶從良女,絕不迎娶過牆妻」,究竟是啥意思?
    古代屬於包辦婚姻的方式,也就是所謂的「父母之命,媒妁之言」,暫且不討論這種方式的對與錯,畢竟所處年代不同,不能以現在的觀點去評判。古人留下不少與婚姻有關的俗語,比如經常聽到的「嫁雞隨雞,嫁狗隨狗」、「床頭吵架床尾和」。今天咱們講的這句俗語是「寧可迎娶從良女,絕不迎娶過牆妻」,究竟是啥意思呢?
  • 1975年這座血肉之軀搭成的「中國梯」,讓五星紅旗在珠峰飄揚
    在珠峰北坡海拔8600米的地方,有一處30米高、幾乎垂直的峭壁,如同大自然使用天斧將雪山垂直劈開了一塊——它就是曾經令所有登山者們都談之色變的「第二臺階」。這架金屬梯不僅幫助這批中國登山隊員成功登頂,它還擔負了33年神聖的使命,截止到2008年,它總共幫助了1300多名來自世界各地的登山者實現了自己的珠峰夢。這架金屬梯有一個響亮的名字:「中國梯」。「人在那個高度,每一個動作都非常需要體能。光是打四個巖點、把那個梯子用尼龍繩綁在上面這幾個動作,就因為缺氧,我們整整用了一天的時間。」
  • 寧波天池,天下第一梯,冰雪勝地
    在建設觀頂湖水庫的引水工程過程中,在水庫下方建成了1368級臺階,引水管道沿梯道而建,沿著山體從山腳直達山頂,取「平步青雲」之意,命名為「青雲梯」,因其臺階之多,被譽為「天下第一梯
  • 愛天秤座男人,你有心理準備嗎?
    你以為天秤座男人像他所表現出來的那樣溫文爾雅嗎?其實做人做事。表面如沐春風背地裡各種過牆梯的人就是他們。你以為只要再約會幾次他就會帶你去見父母了嗎?你以為你和他在一起約會的時候那小碰草打過來,電話的女生真的就是他的姐姐妹妹或者遠房親戚嗎?
  • 溫嶺大火現場驚現"頂梯哥" 網友點讚稱生命之梯讓人動容
    火災無情,人間有愛。火災發生後,在救援人員和附近民眾的合力下,先後從火場救出了20多名被困人員。  1月15日下午,微博「溫嶺發布」發出一張照片,是消防官兵和民眾用梯子救人的場景。有人在地上,有人爬在半空中,其中一個黑衣男子彎著腰,把梯子頂在肩膀上。微博說:救人過程中,因為梯子不夠高,這位群眾一直用雙肩頂著沉重的梯子,受力太重,腰都彎了。