橋接模式-掙錢的設計模式。

前言:設計模式

寫了N多年代碼,知道設計模式已經有8,9年了,用過設計模式,有一些又很好的用處。可是也有一些是不該該存在的設計模式。this

從這裏開始: spa

橋接模式設計

1.做用:code

將一個抽象與實現解耦,以便二者能夠獨立的變化。(摘自wikiblog

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?我爲何以爲咱們在這裏:偏題了。只有對抽象的擴充,已造成新的實現。沒有出現和做用所言的,兩者獨立變化!!!

將一個抽象與實現解耦,以便二者能夠獨立的變化??抽象沒有一絲一毫的變化,只有現實在變化。抽象沒有絲毫的變化。一旦出現這種狀況。抽象進行了變化,覺得着什麼。抽象進行了擴充,加強了功能。可是實現依然是抽象的實現。

(這不是外觀模式嗎?那麼橋接模式在那裏?)

一旦抽象和實現解耦,意味這他們擁有着不一樣的含義。這個時候,進行重構吧。

相關文章
相關標籤/搜索