前言:設計模式
寫了N多年代碼,知道設計模式已經有8,9年了,用過設計模式,有一些又很好的用處。可是也有一些是不該該存在的設計模式。this
從這裏開始: spa
橋接模式設計
1.做用:code
將一個抽象與實現解耦,以便二者能夠獨立的變化。(摘自wiki)blog
2.UMLip
3.代碼:ci
/** "Implementor" */ interface DrawingAPI { public void drawCircle(double x, double y, double radius); } /** "ConcreteImplementor" 1/2 */ class DrawingAPI1 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius); } } /** "ConcreteImplementor" 2/2 */ class DrawingAPI2 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius); } } /** "Abstraction" */ interface Shape { public void draw(); // low-level public void resizeByPercentage(double pct); // high-level } /** "Refined Abstraction" */ class CircleShape implements Shape { private double x, y, radius; private DrawingAPI drawingAPI; public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) { this.x = x; this.y = y; this.radius = radius; this.drawingAPI = drawingAPI; } // low-level i.e. Implementation specific public void draw() { drawingAPI.drawCircle(x, y, radius); } // high-level i.e. Abstraction specific public void resizeByPercentage(double pct) { radius *= pct; } } /** "Client" */ class BridgePattern { public static void main(String[] args) { Shape[] shapes = new Shape[2]; shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1()); shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2()); for (Shape shape : shapes) { shape.resizeByPercentage(2.5); shape.draw(); } } }
4.評論:get
這個模式是爲了模式而模式,有一個問題:it
若是代碼寫成這個樣子,會有一門課叫作《重構》等待着你,這就是掙錢的緣由。都讓計算機專家賺走了。
Shape已經有了徹底的抽象,DrawAPI有存在的必要馬?No。看不到任何的用處?寫在了Draw方法中和寫在DrawAPI中沒有任何區別。
實際上相似而真正有用的例子是輸出到外設上:好比繪製到屏幕、壓感筆上。可是這裏的基本原理是:屏幕和壓感筆實現了一套相同的繪畫API。
Shape的Draw使用了繪製API,輸出到真正的設備上。
這纔是真正有意義的地方。wait?我爲何以爲咱們在這裏:偏題了。只有對抽象的擴充,已造成新的實現。沒有出現和做用所言的,兩者獨立變化!!!
將一個抽象與實現解耦,以便二者能夠獨立的變化??抽象沒有一絲一毫的變化,只有現實在變化。抽象沒有絲毫的變化。一旦出現這種狀況。抽象進行了變化,覺得着什麼。抽象進行了擴充,加強了功能。可是實現依然是抽象的實現。
(這不是外觀模式嗎?那麼橋接模式在那裏?)
一旦抽象和實現解耦,意味這他們擁有着不一樣的含義。這個時候,進行重構吧。