Java常用设计模式————桥接模式
引言
在實際的業務中,經常會遇到多維度的概念組合,公園的門票,頤和園有年票、月票、日票,故宮也有年票、月票、日票。那么不同的公園和票種類型就可以視為兩種不同的緯度,它們之間會形成相互組合的關系。
在類的設計上,如果任由兩種緯度的類任意組合的話,那么就會形成笛卡爾積的情況,使類泛濫,難以維護。
在設計模式中,橋接模式就是為了解決這個問題而提出的,它通過將兩種或多種緯度以上層抽象的組合關系為基礎,形成一種橋接模型,將業務的組合時機延遲到客戶端調用使才發生,避免在編寫類的時候,大量的枚舉每一種具體情況。
一、待解決問題描述
類似上面公園和票種的緯度關系,這里提出一種簡單的案例:形狀和顏色。
假設我們需要兩種不同的形狀——圓形、正方形,和兩種不同的顏色——紅色、白色,并將它們組合以產生特定的類型,那么我們就需要四種不同:
這種做法雖然簡單直觀,但也大大增加了類的數量,而且兩個維度的概念耦合性太強,如果增加了新的緯度,那么類的規模將成倍增長。
二、橋接模式類圖
在學習橋接模式的時候,不僅應該掌握最主要的緯度的劃分與如何實現橋接,還應該思考橋接模式之外的內容,比如上面的例子中,我們可以很清晰的劃分出形狀和顏色兩個維度,同時下面的類圖也展示了通過怎樣的編碼技巧實現橋接的解耦。還有一點之外的內容就是,我們應該以哪種維度作為主干?為什么接入主干維度的其他維度要采用接口?而主干維度采用抽象類?
上圖中,Shape是一個抽象類,這是對主干維度——形狀的一個抽象,其實現類有Circle、Square,它們代表了一種具體的形狀。
Color是一個接口,Red、White代表兩種不同的具體的顏色。
在這個例子中,Color 和 Shape 相比,很顯然Shape更像是一種主體緯度,而顏色,更適合作為一種附屬屬性依附于主體緯度,在這個例子中 Color 僅僅提供了一種行為,所以直接使用接口來描述,這當然不是必須的。
Color 與 Shape 的關系是聚合,采用的是 set 方法注入到 Shape 中,這需要根據具體的業務來判斷兩種緯度的依賴關系,聚合的耦合度更低,且更靈活,可以只在必要的時候將兩種緯度聚合在一起。而組合可能在構造時就需要傳入屬性,這需要視具體情況而定。
三、橋接模式的具體實現
/*** 主干維度————形狀*/ public abstract class Shape {protected Color color;public void setColor(Color color) {this.color = color;}public abstract void draw(); } /*** 顏色維度*/ public interface Color {void paint(String shape); } public class Circle extends Shape {@Overridepublic void draw() {color.paint("圓形");} } public class Square extends Shape {@Overridepublic void draw() {color.paint("正方形");} } public class Red implements Color {@Overridepublic void paint(String shape) {System.out.println("紅色的" + shape);} } public class White implements Color {@Overridepublic void paint(String shape) {System.out.println("白色的" + shape);} }?以上是橋接模式中的幾個重要角色,以下是測試代碼:
public class Client {public static void main(String[] args) {Shape square = new Square();square.setColor(new Red());square.draw();square.setColor(new White());square.draw();System.out.println("==============");Shape circle = new Circle();circle.setColor(new Red());circle.draw();circle.setColor(new White());circle.draw();} }輸出結果:
紅色的正方形 白色的正方形 ============== 紅色的圓形 白色的圓形總結
橋接模式基于類的最小設計原則,其中包括幾個重要的角色:
1、Client,客戶端
2、Abstraction,抽象類
3、Refined Abstraction ,擴展抽象類
4、Implementor,行為實現類接口
5、ConcreteImplementor, 具體的行為實現
橋接模式標準類圖如下:?
橋接模式有以下幾點好處:
1、實現了抽象與行為的分離
2、更好的擴展性
3、可動態切換實現
4、實現細節對客戶端透明,可以對用戶隱藏實現細節
缺點也有幾點:
1、增加了系統的理解難度和設計難度,由于聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計和編程。
2、橋接模式要求正確識別出系統中的兩個獨立變化的緯度,因此使用范圍具有一定的局限性。
總結
以上是生活随笔為你收集整理的Java常用设计模式————桥接模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gensee移动SDK之(一)结构组成
- 下一篇: Android studio gradl