1. 策略模式和工廠模式
https://mp.weixin.qq.com/s/RG-h7r69JyKUlBZylJJIFQ
在軟件開發中也常常遇到類似的情況,實現某一個功能有多個途徑,此時可以使用一種設計模式來使得系統可以靈活地選擇解決途徑,也能夠方便地增加新的解決途徑。這就是策略模式。
策略模式(Strategy Pattern),指的是定義一系列算法,將每一個算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨立于使用它的客戶而變化。
從上面的示例可以看出,策略模式僅僅封裝算法,提供新的算法插入到已有系統中,策略模式并不決定在何時使用何種算法。在什么情況下使用什么算法是由客戶端決定的。
但是,上面還遺留了一個問題,那就是UserPayServiceStrategyFactory中用來保存所有的策略類的實例的Map是如何被初始化的?各個策略的實例對象如何塞進去的呢?
Spring Bean的注冊
還記得我們前面定義的UserPayServiceStrategyFactory中提供了的register方法嗎?他就是用來注冊策略服務的。
接下來,我們就想辦法調用register方法,把Spring通過IOC創建出來的Bean注冊進去就行了。
這種需求,可以借用Spring種提供的InitializingBean接口,這個接口為Bean提供了屬性初始化后的處理方法,它只包括afterPropertiesSet方法,凡是繼承該接口的類,在bean的屬性初始化后都會執行該方法。
只需要每一個策略服務的實現類都實現InitializingBean接口,并實現其afterPropertiesSet方法,在這個方法中調用UserPayServiceStrategyFactory.register即可。
這樣,在Spring初始化的時候,當創建VipPayService、SuperVipPayService和ParticularlyVipPayService的時候,會在Bean的屬性初始化之后,把這個Bean注冊到UserPayServiceStrategyFactory中。
2、抽象類和接口
分為兩個層次:語法層面和設計層面;
語法層面:接口是多繼承,抽象類是單繼承,
抽象類有構造方法,接口沒有,
抽象類中可以有成員方法的具體實現細節,接口只能有抽象方法
成員變量
設計層面:抽象類是對事物的抽象,整體類,接口是針對一種行為規范,是部分類(行為)的抽象,
抽象類是模版設計,接口類是輻射式設計,如果增加一個方法,抽象類只需要改它本身,而對接口而言,繼承該接口的所有實現類都需要改動。
3. websocket實現web消息推送(基于Java注解實現websocket服務終端)
添加鏈接描述
4. 分布式事務和分布式鎖
目標不同
分布式事務旨在保證跨服務操作的ACID屬性,確保所有操作要么全部成功,要么全部失敗。
分布式鎖旨在解決并發訪問共享資源的問題,保證資源的互斥訪問。
實現機制不同
分布式事務通常涉及到多個服務之間的協調和通信,可能需要使用復雜的協議來達成一致。
分布式鎖則更加關注于資源訪問的控制,通常通過鎖的獲取和釋放來實現。
應用場景不同
分布式事務適用于需要跨服務進行數據一致性的場景。
分布式鎖適用于保護單一資源免受并發訪問的場景。
5. JUC(Java并發工具包)是Java提供的一個用于處理線程的工具包。
JUC(Java并發工具包)是Java提供的一個用于處理線程的工具包,它包含了多種常用的并發工具類,這些工具類可以幫助開發人員更加高效地編寫多線程程序。下面將介紹一些JUC中的常用工具類:
CountDownLatch
CountDownLatch是一個同步工具類,用于協調多個線程之間的同步操作。它允許一個或多個線程等待其他線程完成各自的操作。CountDownLatch的構造函數接受一個整數參數,表示計數器的初始值。每個線程在完成自己的操作后,會調用CountDownLatch的countDown()方法,將計數器減一。當計數器減到0時,等待在CountDownLatch上的線程就可以恢復執行。
6. ?并發和多線程關系緊密,多線程是實現并發編程的重要技術途徑,通過創建多個線程并行執行任務,可以實現系統級別的并發運行。
?異步和多線程也是相互關聯的,多線程編程中可以實現異步操作,例如一個線程執行IO操作(如網絡請求)時不阻塞主線程,而是通過回調或Future機制在操作完成時通知主線程,這就是典型的異步編程場景。
區別:
?并發關注的是任務的執行方式,強調多個任務看起來同時運行的效果,而不論底層是如何實現的(可能是多線程、協程或者其他技術)。
?多線程特指在單一進程中同時運行多個執行線程的技術細節。
?異步關注的是任務執行的流程控制,強調任務之間互不影響,無需等待即可繼續執行的特點,它既可以應用于單線程環境(如事件驅動編程),也可以應用于多線程環境。