日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java 24种设计模式

發布時間:2023/12/10 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 24种设计模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

設計模式的七大原則

  • 開閉原則:對擴展開放、對修改關閉。
  • 單一指責原則:一個類只做一件事。
  • 依賴倒轉原則:類似于ioc,采用接口編程。
  • 迪米特原則:高內聚,低耦合。
  • 接口隔離原則:應該使用多個接口,而不是用單一的總接口。
  • 合成復用原則:盡量使用對象組合,而不是繼承來達到復用目的。
  • 里氏替換原則:子類可以擴展父類的功能,但不能改變原有的功能。
  • 一、創建型模式(5種)

    1、單例模式(Singleton)

    保證一個類只有一個實例,并提供一個全局訪問點。

    有四種單例實現方式:java設計模式之單例模式singleton_現實、太殘忍的博客-CSDN博客

    2、工廠模式(Factory)

    把對象的創建功能交給工廠,達到解耦目的。

    適合場景:

  • 無法預知對象確切類別及依賴關系時,可使用。
  • 希望復用現有對象來節省系統資源,而不是每次都創建對象。
  • 3、抽象工廠模式(Abstract Factory)

    用于創建一系列相關的對象,?而無需指定其具體類

    適合場景:

  • 如果代碼需要與多個不同系列的相關產品交互,由于無法提前獲取相關信息或未來擴展考慮,不希望代碼基于產品的具體類來進行構建的情況下使用。
  • 當有一個基于一組抽象方法的類,且其主要功能不明確時,可以使用。
  • 用例:spring的BeanFactory。和其他任何用于創建對象但返回接口或抽象類的就是此模式。

    搭配模式:策略模式

    4、生成器模式(Builder)

    定義一個類來簡化復雜對象的創建(分步驟創建)。該類是為了構建另一個類的實例。

    適合場景:

  • 避免“重疊構造函數”的出現。
  • 當希望用代碼創建不同形式的產品時使用。
  • 比如訂單系統,訂單對象就是一個復雜對象,我們就可以build來做。
  • 用例:SpringApplicationBuilder、StringBuilder

    5、原型模式(prototype)

    使你能夠復制已有對象,?而又無需使代碼依賴它們所屬的類。

    適合場景:

  • 創建一個對象的實例非常復雜且耗時時可以使用
  • 例如我們的DTO、BO、DO、VO轉換時可以使用
  • 用例:spring的bean有單例模式singleton和原型模式prototype(scope=prototype)

    二、結構型模式(7種)

    1、代理模式(Proxy)

    代理控制著對于原對象的訪問(不能直接訪問原對象),?并允許在將請求提交給對象前后進行一些處理。

    適合場景:

  • 用于保護原對象
  • 用于增強原對象
  • 用例:jdk的Proxy類

    2、適配器模式(Adapter)

    用于新接口和舊接口的適配,使接口不兼容的對象能夠相互合作。

    適合場景:

  • 希望使用某類,但與接口或其他代碼不兼容時使用
  • 用例:springmvc的HandlerAdapter。例如xml轉json,可以新增XmlJsonAdapter適配器類內進行轉換

    3、橋接模式(bridge)

    將抽象和抽象的具體實現進行解耦,使得抽象和抽象的具體實現可以進行獨立變化。并使用組合的方式將多維度的抽象方法聯系在一起

    適合場景:

  • 想要拆分或重組一個具有多重功能的龐雜類(例如多個能與數據交互的類)可使用。
  • 想在幾個緯度上擴展類。
  • 想要在運行是切換不同實現方法。
  • 4、組合模式(composite)

    可以使用它將對象組合成樹狀結構,以表示“部分-整體”的層次結構,?并且能像使用獨立對象一樣使用它們。

    讓客戶端看起來在處理單個對象和對象的組合是平等的,換句話說,某個類型的方法同時也接受自身類型作為參數。例如Map的putAll(Map)方法

    適合場景:

  • 需要實現樹狀對象結構時。
  • 希望客戶端代碼以相同方式處理簡單和復雜元素時。
  • 常用于遞歸操作的優化上
  • 實例:

    5、外觀模式/門面模式(Facade)

    為一組接口、抽象類或子系統提供簡化的接口。并且要求一個子系統的外部與其內部的通信必須通過一個統一的Facade對象進行。

    Facade模式提供一個高層次的接口,使得子系統更易于使用

    適合場景:

  • 需要一個指向復雜子系統的直接接口,但使用的功能有限時。
  • 子系統組織為多層結構時。
  • 保護子系統的接口,可以使用門面模式只提供某些接口,不提供全部。
  • 使用Dubbo,向外提供的服務就盡量采用門面模式,然后服務在調用各種service做聚合
  • 實例:

  • tomcat的RequestFacade
  • SLFJ日志就是門面日志
  • 6、裝飾模式(Decorator/Wapper)

    你通過將對象放入包含行為的特殊封裝對象中來為原對象綁定新的行為。相當于動態的給一個對象附加額外的功能,因此它也是子類化的一種替代方法。(就是在不繼承的情況下,擴展類的功能)

    實例:

  • tomcat對request的包裝ServletRequestWrapper
  • 所有的io流包裝類
  • 7、享元模式(Flyweight)

    它摒棄了在每個對象中保存所有數據的方式,?通過共享多個對象所共有的相同狀態,?讓你能在有限的內存容量中載入更多對象。

    簡單來說就是使用緩存來減小對象的訪問時間(使用共享技術實現元素的共享)

    適合場景:程序必須支持大量對象且沒有足夠的內存容量時使用(共享變量)

    實例:

  • 只要用到了緩存,基本都是在使用享元模式

  • 三、行為型模式(12種)

    1、責任鏈模式(Chain of Responsibility)

    將請求沿著處理者鏈進行發送。?收到請求后,?每個處理者均可對請求進行處理,?或將其傳遞給鏈上的下個處理者。

    可以實現解耦。責任鏈中的對象是同一接口或抽象類的不同實現。

    適合場景:

  • 程序需要用不同的方式處理不同請求,而且請求類型和順序未知時。
  • 當必須按照順序執行多個處理者時。
  • 如果所需處理者及其順序必須在運行時進行改變時。
  • 用例:

  • servler中Filter過濾器
  • 攔截器等
  • 2、命令模式(Command)

    將命令包裝在對象中,以便可以存儲、傳遞到方法中,并像任何其他對象一樣返回(以命令動作為類名)

    命令模式可以把發出命令的責任和執行命令的責任分開。

    適合場景:

  • 需要通過操作來參數化對象。
  • 想要將操作放入隊列中,本地執行操作或遠程執行操作時,可以使用。
  • 想要實現操作回滾功能時。
  • 用例:

  • java.lang.Runnable
  • javax.swing.Action
  • 3、迭代器模式(Iterator)

    讓你能在不暴露集合底層表現形式?(列表、?棧和樹等)?的情況下遍歷集合中所有的元素。

    提供一個統一的方式來訪問集合中的對象。

    適合場景:

  • 當集合背后時復雜的數據結構,希望對客戶端隱藏時(處于便利性或安全性)
  • 可以監視程序中重復的遍歷代碼時
  • 希望遍歷不同,甚至是無法預知的數據結構時。
  • 用例:

  • Iterator
  • Vector集合
  • set集合
  • 4、中介模式(Mediator)

    能讓你減少對象之間混亂無序的依賴關系。?該模式會限制對象之間的直接交互,?迫使它們通過一個中介者對象進行合作。(用一個中介對象來封裝一系列關于對象交互行為)

    即使用一個中間對象來進行消息分發以及減少類之間的直接依賴

    適合場景:

  • 當一些對象或其他對象緊密耦合難以對其進行修改時。
  • 當組件過于依賴其他組件而無法在不同應用中復用時。
  • 如果為了能在不同情景下復用一些基本行為,而導致需要被迫創建大量組件子類時。
  • 用例:

  • mq使用的就是此模式
  • MVC中的Controller
  • Executor
  • 5、備忘錄模式(Memento)

    允許在不暴露對象實現細節的情況下保存和恢復對象之前的狀態。

    即生成對象狀態的一個快照,以便對象可以恢復原始狀態而不用暴露自身的內容。

    在不破壞封裝性的情況下,捕獲并保存一個類的內部狀態,可以利用該保存的狀態實施恢復操作。

    適合場景:

  • 當你需要創建對象狀態快照來恢復其之前的狀態
  • 當直接訪問對象的成員變量、get、set時導致封裝被突破時
  • 用例:

  • Date對象通過自身內部的一個long值來實現備忘錄模式
  • Serializable
  • 6、觀察者模式/發布訂閱模式(Observer/Listener)

    允許你定義一種訂閱機制,?可在對象事件發生時通知多個?“觀察”?該對象的其他對象。

    適合場景:

  • 當一個對象的改變需要改變其他對象時,或實際對象時事先未知的或動態變化的時。
  • 當應用中的一些對象必須觀察其他對象時。
  • 用例:

  • EventListener
  • tomcat的LifeCycleListener
  • 使用zookeeper作為觀察者,例如分布式鎖、服務發現等
  • 7、狀態模式(State)

    能在一個對象的內部狀態變化時改變其行為,?使其看上去就像改變了自身所屬的類一樣。

    允許您在運行時根據內部狀態輕松更改對象的行為。

    狀態模式重點在各狀態之間的切換從而做不同的事情,狀態模式不同狀態下做的事情不同。

    狀態模式封裝了對象的狀態,因為狀態是跟對象密切相關的,它不能被重用

    適合場景:

  • 如果對象需要根據自身當前狀態進行不同行為,同時狀態的數量非常多且與狀態相關的代碼會頻繁變更時。
  • 如果某個類根據成員變量的當前值改變自身行為,從而需要使用大量的條件語句時。
  • 當相似狀態和基于狀態轉換中存在許多重復代碼時
  • 8、策略模式(Strategy)

    它能讓你定義一系列算法,?并將每種算法分別放入獨立的類中,?以使算法的對象能夠相互替換

    即將一組算法封裝成一系列對象。通過調用這些對象可以靈活的改變程序的功能

    策略模式更側重于根據具體情況選擇策略,并不涉及切換。策略模式做的都是同一件事。

    策略模式封裝算法或策略,通過從Context中分離出策略或算法,我們可以重用它們。

    適合場景:

  • 想使用對象中各種不同的算法變體,并希望在運行時切換算法時。
  • 如果算法在上下文的邏輯中不是特別重要,使用該模式能將類的業務邏輯與算法實現細節隔離開來。
  • 當類中使用了復雜條件運算符如:if else,以在同一算法的不同變體中切換時。
  • 可以用策略模式和工廠模式優化程序中過多的if-else

    9、模版模式(template)

    在超類中定義了一個算法的框架,?允許子類在不修改結構的情況下重寫算法的特定步驟。

    即讓子類可以重寫方法的一部分,而不是整個重寫,你可以控制子類需要重寫那些操作。

    適合場景:

  • 只希望客戶端擴展某個特定的算法步驟,而不是整個算法或其結構時。
  • 當多個類的算法除了一些細微不同之外幾乎完全一樣時。
  • 用例:

  • InputStream類的skip或read方法
  • 我們可以做一個抽象類,某個方法需要子類來實現差異化
  • 10、訪問者模式(Visitor)

    提供一個方便的可維護的方式來操作一組對象。它使得你在不改變操作的對象前提下,可以修改或者擴展對象的行為。

    它能將算法與其所作用的對象隔離開來。雖然可以在不改變原有類結構的基礎上不斷添加新的功能。但是缺點是破壞了封裝性

    適合場景:

  • 需要對一個復雜的對象結構(如對象樹)中所有的元素執行某些操作時。
  • 可使用此模式來清理輔助行為的業務邏輯
  • 當某個行為僅在類層次結構中的一些類中有意義,在其他類中沒意義是。
  • 11、空對象模式(Empty)

    它允許抽象空對象的處理。

    用例:

  • Collections類的emptyList()
  • Collections類的emptyMap()
  • Collections類的emptySet()
  • 12、解釋器模式(Interpreter)

    通常描述為該語言定義語法并使用該語法來解釋該格式的語句

    用例:

  • Pattern類
  • Normalizer類
  • Format類
  • 更多更詳細設計模式請參考:常用設計模式有哪些?

    總結

    以上是生活随笔為你收集整理的java 24种设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。