這次的這篇文章主要是和大家分享了關於JAVA之常用設計模式 ,有需要的小伙伴可以看一下。
很早就接觸了設計模式,今天在看一些文章的時候發現自己在學習理解設計模式的時候有些偏差。設計模式應該服務於特定的場景,並且是經過前人經驗總結而來的程式碼解決思路,這種解決思路考慮的點在於如何能夠讓程式碼之間的耦合度更低並且減少冗餘,使得程式碼耦合度更低的目的是為了程式更好的擴展,所謂的更好的擴展是指在功能的變動或擴展的情況下盡可能觸發較少較少的改動。所以在學習設計模式的時候,一個好的學習方式應該是模擬程式的擴展來比較在使用前人總結的設計模式和現有程式碼的不同之處,只有真正體會到其優點,才能盡得其精髓。
建立型模式
建立行模式抽象化了物件的實例化過程,它幫助一個系統如獨立於如何建立、組合和表示那些物件。
抽象工廠模式
抽象工廠模式用於創建具有不同產品族的工廠,所謂產品族是值得是多個不同對象的組合,不同物件值得是相對於實作相同介面的物件來說,所以同一產品族的物件絕對不是實作同一介面。
抽象工廠模式包含7個主要角色,A類抽象角色和A類具體角色(AbstractProductA,ProductA),B類抽象角色和B類具體角色(AbstractProductB,ProductB),抽象工廠(AbstractFactory)提供A類產品和B類產品的兩個方法接口,具體工廠(ConcreteFactory)實現抽象工廠的兩個方法接口,兩個方法接口的實現依賴於A,B不同的產品(createProductA從A產品的實現類中挑選一個實作類,createProductB從B產品的實作類別中挑選一個實作類別)。客戶短(Client)依賴抽象工廠的具體實現類,生產一個特定工廠的產品族產品。
抽象工廠模式實現了多個產品的產品族工廠的提供,實現了多個產品的多維組合,一個典型的例子的產品族如UnixButton和WindowsButton。適用於不同產品組合的工廠提供。從擴展的角度來看,具體工廠的實現了抽象工廠,如果需要一個新的產品族,只要再實現一個產品族即可,實現了熱插拔。比較工廠模式,具體工廠面臨的是一個產品,而抽象工廠面臨的是一系列產品。
建造者模式
#建造者模式的作用是將一個物件的建構步驟抽像出來,使得易於重寫一個對象的建構過程。
建造者模式包含4個主要角色,建造者介面(Builder),具體建造者(ConcreteBuilder),產品物件(Product)和導演類別(Director)。導演類別的construct方法負責呼叫抽象建造者的多個buildPart方法進行組裝,Builder介面定義多個部分組建過程buildPart()方法和組成結果方法retrieveResult()方法供具體建造者實現,ConcreteBuilder實現部分組建方法和結果返回方法,具體的建造者完成對應的組裝任務,並且使用retrieveResult來取得對應的組裝結果。
從目的上來看,建造者模式實現了物件的不同組裝方式的最簡實現方式,組建的順序由導演類控制,而具體的組裝任務分佈在不同的構建者手裡,導演類和抽象建造者的聚合關係使得產品建置的實際操作可以實現熱插拔,使得建置的具體實作更容易擴展或替換。反觀,如果使用導演類直接操作產品實現產品的組裝過程,如果需要改變建造的過程,那麼必須要修改導演類,這是我們不想看到的。
結構型模式
結構型模式著重於解決如何組裝現有的類,設計他們之間的交互,以達到一定的目的,例如擴展性,封裝性。
適配器模式
適配器模式的目的是將一個類別的方法介面轉換成另一個客戶端將要使用的另一個方法介面。
適配器模式含有三個主要角色,客戶端需要的目標介面(Target)及其方法sampleOperation();被適配的類別Adaptee,它是實際的執行者;適配器Adapter,Adapter繼承了Target接口,並且繼承了Adaptee,Adapter的sampleOperation方法呼叫Adptee的sampleOperation方法。實際上,對Adaptee類別方法的呼叫可以使用繼承的方式,也可以使用直接依賴的方式,前者稱為類別適配器,後者稱為物件適配器。
適配器模式實作了一個介面到另一個介面之間的相容性轉換。在擴展性方面並無特別的地方。
裝飾器模式
裝飾器模式又稱為包裝模式,其目的是在不改變原有繼承關係的情況下,動態的擴展類別的功能。這裡所說的擴展的類別的功能可以是已有方法的改變,也可以是提供更多的方法。
裝飾器模式含有4個主要角色,系統已經存在的繼承關係,元件介面(Component)和其實作類別(ConcreteComponent),裝飾者(Decorator)實作了元件介面依賴被裝飾的具體實作類,其sampleOperateration()方法依賴於被裝飾的具體組成類別的sampleOperation()方法,然後具體的裝飾者(ConcreateDecorator)繼承自Decorator,可以實現增加其他方法或者修改對應的sampleOperation方法,從而實現了不改變原有類別並且實現繼承同樣的動態方法擴充,並且對於客戶端來說這種擴充是透明的。
從擴展的角度來看,Decorator代替的原來ConCreteComponent的位置,並且替代其完成繼承的動態擴充,相比直接繼承自ConcreteComponent,這種方法的依賴性更小,其裝飾的對象也是可以動態插拔的,ConcreteComponent並需要知道裝飾類別的存在,免去複雜類別關係的維護。
一個應用的具體例子就是BufferInputStream和FileInputStream之間的關係,InputStream是Component, FileInputStream、ByteArrayInputStream等是具體元件,FilterInputStream是裝飾者,BufferInputStream等繼承自FilterInputStream,是具體的裝飾者。
代理模式
代理模式的目的是為一個物件提供一個代理,代理物件可以增強,修改甚至刪除原有的功能。
因為代理模式應用十分廣泛,所以代理模式已經在另一篇部落格中詳加敘述了,這裡不再累贅。
結構型模式
結構型設計模式專注於類別或物件之間的職責分配,研究的是多個類別或物件如何有效率的合作來完成一個任務。
觀察者模式
觀察者模式的目的是實現一對多的依賴關係,使得主題更新的時候能夠將這種更新以特定的方式通知與主題綁定的觀察者。
觀察者模式包含4個參與者,主題介面和具體實作主題(Subject,ConcreteSubject),觀察者和具體觀察者(Observer,ConcreateObserver)。 observer透過聚合方式註冊到Subject中,由於依賴關係定義介面中,具體主題可以實現不同的通知策略,並且具體觀察者和具體主題之間可以實現低耦合依賴。
兩者之間的依賴關係可以透過attach和detach方法進行建立和解除,subject在狀態改變時可以透過notifyObserver通知所有的observers,呼叫對應observer的update方法。
從擴展的角度來看,觀察者模式的好處在於在新增observer的時候只需要實現observer接口,然後在想要監聽的具體subject中attach就實現了添加;同樣的,如果想要刪除一個subject中的一個observer也僅僅需要呼叫attach方法,實現了熱插拔。如果不採用這種設計方式,任何一方不適用介面都會導致一方的新增困難。
中介者模式
中介者模式的作用是使用一個中介物件封裝一系列物件的交互,使得各個物件的交互不需要顯示的相互依賴。簡單來講,就是讓不同物件之間的交互作用由多對多的網狀關聯轉換成一對多的星狀關聯。
中介者模式由四個主要角色來構建,中介者介面(Mediator)定義公用互動方法changed(); 具體中介者(ConcreteMediator)實作具體的互動方法changed(),並且取得需求持有需要通訊的colleague的引用,changed()方法的具體實作依賴於所持有的colleague引用; 同事抽象類別(Colleague)定義同事介面對中介者介面的關聯關係,並且提供取得中介者的介面方法; 具體的同事實作類別(ConcreteColleague)可能有多個,主要是實現具體的交互操作,交互操作依賴其關聯的中介者的changed方法。至於為什麼說是變成了一對多的關係,從上面四個角色的關係來看,每個colleague都持有一個mediator的引用,而每個mediator持有所有colleage的引用。
中介者模式優點在於解耦複雜系統物件的交互,使得再增加或刪除colleage時僅需要修改中間的中介者。中介者也可以替換成另一個具體中介者,取代對應的互動行為。缺點之處在於隨著需要互動同事的不斷增加,具體中介者也會不斷膨脹。
以上是JAVA之常用設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!